2011-07-25 37 views
5

Tôi muốn sử dụng các bộ lọc của Hibernate, để lọc các đối tượng "MyEntity", sử dụng một lựa chọn "AnotherEntity" trong điều kiện bộ lọc. Cấu hình trông giống như sau:Làm thế nào để sử dụng thuê bao HQL trong điều kiện bộ lọc Hibernate?

<hibernate-mapping> 

    <filter-def name="myFilter" condition="someProperty in (select x.property1 from AnotherEntity x where property2 = :property2)"> 
    <filter-param name="property2" type="long"/> 
    </filter-def> 

    <class name="com.example.MyEntity" table="SOME_TABLE"> 
    <id name="OID" column="O_ID" type="long"> 
     <generator class="hilo"> 
     <param name="table">oid_id</param> 
     <param name="column">next_id</param> 
     </generator> 
    </id> 
    <version name="hibernateVersion" column="hibernate_version" unsaved-value="negative"/> 
    <property name="someProperty"/> 
    <filter name="myFilter"/> 
    </class> 

    <class name="com.example.AnotherEntity" table="ANOTHER_TABLE"> 
    <composite-id> 
     <key-many-to-one name="property1" ... /> 
     <key-many-to-one name="property2" ... /> 
    </composite-id> 
    </class> 

</hibernate-mapping> 

nào mang lại cho tôi một org.hibernate.exception.SQLGrammarException: could not execute query tương ứng một SQLException Table "ANOTHERENTITY" not found, kể từ khi câu lệnh SQL được tạo ra chứa "AnotherEntity" thay vì bảng ánh xạ "ANOTHER_TABLE" như thể ánh xạ đã không được tìm thấy. Tuy nhiên, khi tôi chỉ thực hiện việc chọn một số điện thoại

select x.property1 from AnotherEntity x where property2 = :property2 

nó hoạt động tốt.

Tôi bỏ lỡ điều gì ở đây? Cấu hình của tôi có sai không? Tôi có thể sử dụng Suselect HQL trong các bộ lọc không?

+0

Tôi có cùng một vấn đề. Bạn đã tìm thấy một giải pháp? – Saffar

+0

Tôi đã tạo câu trả lời, xem bên dưới. Tôi nghĩ bạn phải viết SQL vì HQL không được hỗ trợ. –

Trả lời

4

Khi nó quay ra, điều kiện lọc không hỗ trợ HQL trong tất cả vinh quang của nó. Bạn phải sử dụng SQL hoặc viết chính xác hơn một đoạn mệnh đề WHERE. Điều đó có nghĩa là bạn phải sử dụng tên bảng và cột chứ không phải tên thực thể và thuộc tính.

Tuy nhiên, bạn có thể sử dụng trình giữ chỗ được đặt tên tốt. Gắn bó với ví dụ trong câu hỏi bạn sẽ viết điều kiện của mình như thế này:

<filter-def name="myFilter" condition="SOME_COLUMN in (select x.COLUMN_X from ANOTHER_TABLE x where COLUMN_Y = :foo)"> 
    <filter-param name="foo" type="long"/> 
    </filter-def> 

Có vẻ như điều kiện này được gắn với truy vấn sau khi HQL được dịch sang SQL nhưng trước khi thay thế trình giữ chỗ được thực hiện. Ít nhất là cho phiên bản 3.x của Hibernate.

+0

là nó có thể làm gia nhập và lọc hồ sơ dựa trên giá trị cột của một bảng tham gia bằng cách sử dụng bộ lọc hibernate? –

+0

Tôi xin lỗi nhưng tôi không có thiết lập và không thể dùng thử. Nhưng tôi nghĩ rằng các bộ lọc chỉ được thêm vào mệnh đề where của SQL kết quả để nó có thể hoạt động. –

+1

trông giống như các tập tin ngủ đông sẽ không cho phép tôi lọc dựa trên giá trị cột của bảng đã tham gia .. xem https://hibernate.atlassian.net/browse/HHH-298 –

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