2012-04-26 78 views
6

Trong một trong các ứng dụng của tôi, tôi thực hiện tìm kiếm trên nhiều trường/cột. Tìm kiếm nâng cao của nó và có hơn 20 trường sử dụng mà người dùng có thể tìm kiếm kết quả. Ví dụ, người dùng có thể tìm kiếm việc đặt dựa trênTìm kiếm nâng cao Sử dụng Tìm kiếm Hibernate

    Id Đặt trước
  1. hành khách Tên
  2. hành khách Tuổi
  3. Từ Location
  4. Để Location
  5. Đặt trước Status
  6. Tên của Hãng hàng không

và 13 trường như vậy.

Tôi đang cố gắng tìm hiểu xem

  1. Hibernate tìm kiếm có thể và nên được sử dụng ở đây? Nếu vậy, làm thế nào? Tôi không thể tìm thấy một ví dụ cho một tìm kiếm phức tạp như vậy bằng cách sử dụng Tìm kiếm Hibernate.

  2. Thay vì tìm kiếm Hibernate, tôi có thể chỉ cần sử dụng Hibernate và có thể thiết kế tìm kiếm đa luồng tùy thuộc vào số lượng tham số. Đó là một ý tưởng tốt chứ?

  3. Có thể sử dụng Bộ lọc Hibernate ở đây không?

Ai đó có thể vui lòng cung cấp đầu vào hoặc liên kết tham chiếu không?

+0

Bạn có mong đợi người dùng nhập tiêu chí tìm kiếm của họ vào một trường và sau đó kiểm tra điều đó với nhiều cột không? Hoặc tách các trường tìm kiếm cho mỗi cột? –

+0

Các trường riêng biệt cho mỗi cột. –

Trả lời

2

Đối với các loại truy vấn này, tôi thường sử dụng truy vấn Criteria với đối tượng biểu mẫu. Sau đó, tôi kiểm tra null trong mỗi trường biểu mẫu đã qua và nếu không null, sau đó thêm một số khác Restriction vào truy vấn, sử dụng trường đó. Sử dụng truy vấn Criteria giữ mã Java rất sạch sẽ và loại bỏ nối chuỗi lộn xộn. Ví dụ cho trường hợp của bạn:

// Form object 
public class bookingSearchForm { 
    private String bookingId; 
    public getBookingId()... 
    public setBookingId()... 
} 

// Hibernate 
Criteria criteria = getSession().createCriteria(Booking.class); 
if(form.getBookingId() != null) { 
    criteria.add(Restrictions.eq("bookingId", form.getBookingId())); 
} 
criteria.list(); 
+0

Xin chào @Aaron, cảm ơn bạn đã trả lời. Vấn đề của tôi là dữ liệu được trải rộng trên khoảng 25 bảng. Vì vậy, nếu tôi đang sử dụng Tiêu chí, nó sẽ là một tuyên bố lớn với Joins. Đây là điều tôi muốn tránh để thực hiện sạch sẽ. những gì bạn đang đề xuất hoạt động hoàn hảo nếu tôi có nói 5-6 trường để tìm kiếm. –

+0

Nếu bạn có các thực thể Hibernate được thiết lập với các mối quan hệ, thì Hibernate sẽ xử lý tất cả các kết nối đó cho bạn và bạn sẽ có thể sử dụng chiến lược trên trên các bảng khác đó. Hãy suy nghĩ trong Hibernate, không phải SQL, và để cho công cụ làm công việc cho bạn. – atrain

+0

Tôi không chắc chắn nếu tôi hiểu bạn một cách chính xác. Hãy để tôi cung cấp cho bạn một ví dụ, tôi tìm kiếm "Đặt chỗ" trong đó "Loại chuyến đi" là "một chiều". Loại Chuyến đi được nhúng trong một Lớp có 6 cấp độ thấp hơn lớp 'Đặt chỗ'. Vì vậy, tôi thực sự sẽ phải tìm kiếm trên Loại chuyến đi chứ không phải trên lớp đặt chỗ. Bây giờ có thể có 20 thông số như vậy mà tôi sẽ tìm kiếm được nhúng ở các cấp độ khác nhau từ lớp Đặt chỗ. Nếu tôi phải làm điều này bằng cách sử dụng một tiêu chí, tôi sẽ phải tham gia tất cả các bảng ở các cấp độ mà tôi nghĩ là rất cồng kềnh. –

0

Có, Hibernate Search sẽ rất hữu ích trong trường hợp này. Bạn có thể sử dụng bộ lọc, nhưng Hibernate Search cũng có bộ lọc.

2

Tôi nghĩ rằng quyết định của bạn nên dựa trên yêu cầu về năng lực. Truy vấn Hibernate thông thường có thể đủ để tìm kiếm trên nhiều trường đó.

Hibernate Search sẽ giúp bạn nếu bạn muốn truy vấn tìm kiếm nhanh chóng với lượng lớn dữ liệu, sử dụng chỉ mục ngược. Những gì bạn cần làm là tải cơ sở dữ liệu của bạn với khả năng bạn mong đợi trong 5 năm tới chẳng hạn. Nếu truy vấn Hibernate bình thường của bạn được coi là chấp nhận được, tôi nghĩ bạn nên gắn bó với truy vấn Hibernate thông thường.

Bạn cũng có thể giới thiệu Hibernate Search ở giai đoạn sau.

EDIT: Bạn có thể chọn không sử dụng Tìm kiếm Hibernte, chuyển xuống cấp thấp hơn và sử dụng Apache Lucene thay thế. Bạn có thể tạo chỉ mục Lucene Apache của riêng bạn. Bằng cách này bạn không phải lo lắng về trường nào để tìm các bản ghi vì bạn sẽ có toàn quyền kiểm soát quá trình lập báo hiệu và lập chỉ mục. Bạn có thể lưu tên hàng và cột như một phần của kết quả tìm kiếm nếu bạn chọn cách này.

+0

Cảm ơn bạn đã trả lời @Daniel. Mối quan tâm của tôi ở đây là số lượng mã phức tạp cần phải được viết để tạo truy vấn. Tôi đang tìm kiếm từ hơn 25 bảng và số lượng tham gia cần thiết để được viết bằng tay sẽ rất dễ bị lỗi. –

+0

Lo lắng về mã phức tạp? Đi xuống một cấp độ để Apache Lucene. Bạn không phải tạo truy vấn Hibernate, thay vì truy vấn chỉ mục Lucene mà bạn tự tạo. Hạn chế duy nhất là bạn cần phải hiểu công nghệ Lucene cơ bản. –

Các vấn đề liên quan