2009-11-27 29 views
7

Mỗi lần như vậy, tôi nhận được một "org.hibernate.QueryException: đường dẫn kết hợp trùng lặp: myAssociation". Điều này là do các tiêu chí phức tạp mà tôi đang làm việc có thể xác định cùng một đường dẫn ở nhiều nơi. Tôi muốn làm điều gì đó nhưLấy tiêu chí theo hiệp hội

Criteria association = myCriteria.getAssociation("wax"); 
if(association == null) association = myCriteria.createCriteria("wax"); 

Có cách nào để tôi có thể kiểm tra xem một liên kết đã có sẵn chưa?

Cheers

Nik

+0

Bạn không nên sử dụng bí danh duy nhất trong truy vấn, thay vì hy vọng tên bạn muốn chưa được lấy? – skaffman

Trả lời

3

Không có cách nào để làm điều đó thông qua Tiêu chuẩn API. Tuy nhiên, bạn có thể tự duy trì một số Map nếu bạn thực sự cần điều này xảy ra.

Bạn có thể:

  • có một bản đồ cho mỗi trường hợp tiêu chí, tiêu chuẩn lồng nhau keyed bởi bí danh.
  • có một bản đồ toàn cầu duy nhất; khóa của nó sẽ phải có cả bí danh của các tiêu chí lồng nhau và đường dẫn từ gốc đến tiêu chí hiện tại.
+0

Yup, đây là những gì tôi đã làm, chỉ cần giữ chúng xung quanh. Sẽ rất tuyệt khi có thể tìm kiếm chúng, mặc dù sẽ giúp tôi tiết kiệm rất nhiều nếu thử nghiệm và đặt. :-) – niklassaers

5

Thực ra bạn có thể tìm thấy Tiêu chí phụ theo bí danh, nhưng mã không được xuất bản (tức là trong lớp CriteriaImpl). Xem ví dụ của tôi bên dưới:

private Subcriteria getCritria(Criteria pCriteria, String pAlias) { 
    Iterator<Subcriteria> iter = ((CriteriaImpl)pCriteria).iterateSubcriteria(); 
    while (iter.hasNext()){ 
     Subcriteria sub = iter.next(); 
     if (pAlias.equals(sub.getAlias())){ 
      return sub; 
     } 
    } 
    return null; 
} 
+2

Giải pháp tuyệt vời !! – samz

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