2009-05-13 41 views
8

Tôi cần sao chép truy vấn HQL đang hoạt động sau đây bằng API tiêu chí.Các dự báo hỗ trợ API Tiêu chuẩn NHibernate có thuộc tính bộ sưu tập không?

session.CreateQuery(
    "select c " + 
    "from Parent p " + 
    "inner join p.Children c " + 
    "where p.Id = 9 " + 
    "and c.Id = 33") 
    .SetMaxResults(3) 
    .List(); 

Truy vấn chọn tất cả các trẻ em đáp ứng các tiêu chí nhất định thuộc về cha mẹ đáp ứng tiêu chí khác. Trong ví dụ của tôi, cả hai tiêu chí là những điểm cân bằng đơn giản nhưng chúng có thể là bất kỳ thứ gì.

Vì lý do nào đó truy vấn API tiêu chí tương đương trả về danh sách có số lượng mục phù hợp nhưng các mục đó đều rỗng.

session.CreateCriteria(typeof (Parent)) 
    .Add(Restrictions.Eq("Id", 9)) 
    .CreateCriteria("Children") 
    .Add(Restrictions.Eq("Id", 33)) 
    .SetProjection(Projections.Property("Children")) 
    .SetMaxResults(3) 
    .List(); 

Tại sao hai truy vấn này không trả về cùng một kết quả?

Đây là SQL tạo ra từ các truy vấn HQL:

SELECT TOP 3 childid7_, 
       name7_ 
FROM  (SELECT children1_.childid     AS childid7_, 
       children1_.name     AS name7_, 
       Row_number() 
        OVER(ORDER BY current_timestamp) AS __hibernate_sort_row 
      FROM dbo.parent parent0_ 
       LEFT OUTER JOIN dbo.child children1_ 
        ON parent0_.parentid = children1_.parentid 
      WHERE (parent0_.parentid = 9) 
       AND (children1_.childid = 33)) AS QUERY 
WHERE QUERY.__hibernate_sort_row > 0 
ORDER BY QUERY.__hibernate_sort_row 

Và đây là SQL từ truy vấn Tiêu chuẩn API:

SELECT TOP 3 y0_ 
FROM  (SELECT this_.parentid      AS y0_, 
       Row_number() 
        OVER(ORDER BY current_timestamp) AS __hibernate_sort_row 
      FROM dbo.parent this_ 
       INNER JOIN dbo.child child1_ 
        ON this_.parentid = child1_.parentid 
      WHERE this_.parentid = @p0 
       AND child1_.childid = @p1) AS QUERY 
WHERE QUERY.__hibernate_sort_row > 0 
ORDER BY QUERY.__hibernate_sort_row 

Lưu ý rằng tham gia giữa cha mẹ và con là một chiều. Thực thể con không có thuộc tính tham chiếu trỏ đến cha mẹ của nó.

Ai có thể đề xuất giải pháp thay thế cho phép tôi làm việc xung quanh giới hạn này?

+0

Tại sao có child1_.childid> @ p1 trong truy vấn từ API tiêu chí? –

+0

Rất tiếc, đó phải là bằng. –

Trả lời

1

Có vẻ như bạn chỉ muốn các con trở lại, do đó bạn cần phải thay đổi tiêu chí của mình để có được loại đối tượng con, sau đó sử dụng id mẹ làm lựa chọn.

session.CreateCriteria(typeof (Child)) 
.Add(Restrictions.Eq("Id", 33)) 
.CreateCriteria("Parent") 
.Add(Restrictions.Eq("Id", 9)) 
.SetProjection(Projections.Property("Children")) 
.SetMaxResults(3) 
.List(); 
+0

Việc tham gia giữa phụ huynh và trẻ em là một chiều. Thực thể con không có thuộc tính tham chiếu trỏ đến phần tử cha của nó nên tôi không thể đi qua mối quan hệ theo hướng này. –

+0

Nó sẽ hút .. nhưng bạn có thể bản đồ cha mẹ trên các trẻ em trong một tài sản được bảo vệ hoặc biến riêng mà bạn không sử dụng .... – sirrocco

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