2011-11-24 37 views
7

Giả sử tôi có một thực thể MyEntity và có thuộc tính dựa trên công thức fmlaProp. Bây giờ nói tôi tạo ra một tiêu chí:Hibernate - Tiêu chí đặt hàng theo thuộc tính công thức

s.createCriteria(MyEntity.class) 
    .setProjection( 
     Projections.distinct( 
      Projections.property("fmlaProp"))) 
    .addOrder(Order.asc("fmlaProp")); 

trong trường hợp này tôi nhận được lệnh SQL sau:

SELECT DISTINCT fmlaProp-sql FROM MY_ENTITY_TABLE ORDER BY fmlaProp-sql 

Mà cho một lỗi trên Oracle nói rằng lệnh của biểu thức là không được chọn. Sau đó, tôi đã thử các tiêu chí sau:

s.createCriteria(MyEntity.class) 
    .setProjection( 
     Projections.distinct(
      Projections.alias(
       Projections.property("fmlaProp"), 
       "alias1")) 
    .addOrder(Order.asc("alias1")); 

nào tạo ra "tự do alias1" mà hoạt động tốt. Nhưng nó là loại xấu xí - mã phải "biết" những thuộc tính công thức, mà vi phạm nguyên tắc "viết một lần". Bất kỳ suy nghĩ hoặc gợi ý về điều đó? Cảm ơn bạn trước.

+1

Phần '-sql' là gì? – cherouvim

Trả lời

1

Đây là hành vi mong đợi từ Hibernate. Nó không nhất thiết phải làm với thuộc tính công thức, mà bạn muốn làm thứ tự với một giá trị dự kiến. Từ Hibernate Docs:

Một bí danh có thể được gán cho một chiếu để giá trị dự kiến ​​có thể được đề cập đến trong các hạn chế hoặc orderings. Dưới đây là hai cách khác nhau để thực hiện việc này ...

Theo cách khác, bạn có thể thử tạo thuộc tính công thức thành cột ảo (trong phiên bản Oracle 11 trở lên) hoặc gói bảng trong chế độ xem với cột tính toán. Bằng cách đó, Oracle sẽ biết trực tiếp fmlaprop, có thể được sử dụng giống như cột "bình thường".

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