2011-10-14 4 views
5

Mặc dù 3 giờ googling và tìm kiếm API Tôi không thể tìm thấy bất kỳ tham chiếu đến việc có thể sử dụng chức năng cơ sở dữ liệu trong một truy vấn tiêu chuẩn ngủ đông. Để cụ thể:Sử dụng chức năng cơ sở dữ liệu để chuyển đổi cột trong tiêu chí ngủ đông

Tôi muốn truy cập phần ngày của datetime trong cơ sở dữ liệu và nhóm postgres theo đó. Tôi tưởng tượng truy vấn sẽ trông giống như sau:

session.createCriteria(Exam.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.property("DATE(beginExam)").as("beginDate")) 
    .add(Projections.groupProperty("beginDate"))) 
    .list(); 

Điều này không làm việc cho tôi một ngoại lệ "không thể giải quyết thuộc tính: Ngày (beginExam) ...". Có vẻ như đây là một việc rất đơn giản để làm, và tôi phải thiếu cái gì đó. Cho rằng tôi cũng xây dựng các hạn chế động (tôi đã để nó ra trong ví dụ) có vẻ như các tiêu chí là thành phần ngủ đông để sử dụng cho điều này, nhưng tôi mở cho bất kỳ đề xuất nào tại thời điểm này. bằng cách xây dựng nhóm của riêng tôi.

Cảm ơn

Trả lời

1

Hãy xem Projections.sqlProjection và Porjections.sqlGroupProjection

+0

tôi đã làm, triệt để. Trong số nhiều phương thức cho eq và giữa không có phương pháp để biến đổi giá trị của cột thành một ngày để sau đó nó có thể được so sánh hoặc đặt trong một groupProperty. – user996088

+0

@ user996088: Loại dữ liệu của beginExam là gì? bạn có thể sử dụng _any_ SQL trong Projections.sqlProjection vì vậy tôi không thấy lý do tại sao bạn không thể chuyển đổi nó thành một ngày. – tscho

+0

Lỗi của tôi. Trong giận dữ của tôi, tôi đã không nhận ra rằng gkamal đã chỉ cho tôi đi đúng hướng với liên kết sai. – user996088

8

Các bạn đã thử Projections.sqlProjection như thế này

session.createCriteria(Exam.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.sqlProjection("date(beginExam) as beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE })) 
    .add(Projections.groupProperty("beginDate"))) 
.list(); 

hoặc Projections.sqlGroupProjection như gen này

session.createCriteria(Exam.class) 
    .setProjection(Projections.sqlGroupProjection("date(beginExam) as beginDate", "beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE })) 
.list(); 

Hibernate bí danh giá bảng trong truy vấn SQL, vì vậy bạn có thể cần phải thêm {alias} đoạn đến đoạn SQL của bạn để làm cho công việc này:

session.createCriteria(Exam.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.sqlProjection("date({alias}.beginExam) as beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE })) 
    .add(Projections.groupProperty("beginDate"))) 
.list(); 

hoặc với SQLGroupProjection:

session.createCriteria(Exam.class) 
    .setProjection(Projections.sqlGroupProjection("date({alias}.beginExam) as beginDate", "beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE })) 
.list(); 
+0

Ah! Tuyệt, cảm ơn bạn nhiều. Tôi sẽ làm việc thông qua điều đó. – user996088

+0

@ user996088: Lưu ý chỉnh sửa của tôi về đoạn '{alias}', giải pháp được đề xuất của tôi có hoạt động không? Tôi hơi tò mò vì tôi đã không thực sự thực hiện một trong các truy vấn, tôi chỉ viết chúng ở đây (vì vậy cũng có thể có lỗi chính tả) – tscho

+0

Cảm ơn Tscho, ví dụ cuối cùng của bạn đã làm việc cho tôi Projections.sqlGroupProjection ... –