2010-04-30 22 views
6

Tôi có SQL sau đây mà tôi đang gặp sự cố khi chuyển đổi thành HQL. NPE bị ném - điều tôi nghĩ có liên quan đến hàm SUM. Ngoài ra, tôi muốn sắp xếp trên bí danh lựa chọn - điều này có khả thi không?Chuyển đổi SQL với chọn lựa trong HQL

SQL (subselect):

SELECT q.title, q.author_id, 
    (SELECT IFNULL(SUM(IF(vote_up=true,1,-1)), 0) 
    FROM vote WHERE question_id = q.id) AS votecount 
FROM question q ORDER BY votecount DESC 

HQL (không hoạt động)

SELECT q, 
    (SELECT COALESCE(SUM(IF(v.voteUp=true,1,-1)), 0) 
    FROM Vote v WHERE v.question = q) AS votecount 
    FROM Question AS q 
    LEFT JOIN q.author u 
    LEFT JOIN u.blockedUsers ub 
    WHERE q.dateCreated BETWEEN :week AND :now 
    AND u.id NOT IN (
     SELECT ub.blocked FROM UserBlock AS ub WHERE ub.blocker = :loggedInUser 
    ) 
    AND (u.blockedUsers IS EMPTY OR ub.blocked != :loggedInUser) 
    ORDER BY votecount DESC 
+1

chỉ vì tò mò: tại sao bạn muốn dịch một truy vấn sql ngắn gọn trong truy vấn phức tạp và phức tạp như vậy? – bertolami

+0

bạn có thể giúp tôi với http://stackoverflow.com/questions/23303315/hql-query-sum-of-two-sub-select này không –

Trả lời

10

Đây là HQL làm việc nếu có ai quan tâm:

SELECT q, 
(SELECT COALESCE(SUM(CASE v.voteUp WHEN true THEN 1 ELSE -1 END), 0) 
FROM Vote v WHERE v.question = q) AS votecount 
FROM Question AS q 
LEFT JOIN q.author u 
LEFT JOIN u.blockedUsers ub 
WHERE q.dateCreated BETWEEN :week AND :now 
AND u.id NOT IN (
    SELECT ub.blocked FROM UserBlock AS ub WHERE ub.blocker =:loggedInUser 
) 
AND (u.blockedUsers IS EMPTY OR ub.blocked !=:loggedInUser) 
ORDER BY col_1_0_ DESC 

Thông báo ORDER BY col_1_0_

Có một vấn đề mở với Hibernate - nó không phân tích cú pháp các bí danh một cách chính xác và vì các bí danh được đổi tên trong truy vấn, một lỗi sẽ được ném ra. Vì vậy, col_1_0_ về cơ bản là một cách giải quyết - đó là tên Hibernate tạo ra. Xem vấn đề: http://opensource.atlassian.com/projects/hibernate/browse/HHH-892

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