2012-09-17 31 views
38

Tôi chọn hai cột id nhưng bị lỗi cụ thể:truy vấn định tham gia quyến rũ, nhưng chủ sở hữu của hiệp hội lấy đã không có mặt trong danh sách lựa chọn

org.hibernate.QueryException: **query specified join fetching, but the owner of the fetched association was not present in the select list** 

[FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=r,role=null,tableName=REVISIONS,tableAlias=revision1_,origin=ENTITY_CHANGED_IN_REVISION entitychan0_,columns={entitychan0_.REV_ID ,className=ru.csbi.registry.domain.envers.Revision}}] [ select ec.id as entityChangeId, r.id as revisionId from ru.csbi.registry.domain.envers.EntityChange as ec inner join fetch ec.revision as r where ec.groupEntityId = :groupEntityId and ec.groupName = :groupName and r.timestamp < :entityDateFrom and r.timestamp > :entityDateTo and (  ec.revisionType in (0, 5, 1, 4, 2)  and not (ec.otherGroupEntityModified = false and ec.thisGroupEntityModified = true and ec.rowDataModified = false and ec.collectionOfNotGroupEntityModified = false )  ) group by ec.id, r.id having count(*) > :start order by r.id desc] 

Một số mã:

String hql = " select ec.id as entityChangeId, r.id as revisionId from EntityChange as ec " + 
      " inner join fetch ec.revision as r " + 
      " where ec.groupEntityId = :groupEntityId" + 
      " and ec.groupName = :groupName " + 
      " and r.timestamp < :entityDateFrom " + 
      " and r.timestamp > :entityDateTo " + 
      " and (" + 
      "  ec.revisionType in (" + 
         RevisionType.ADD.getRepresentation() + ", " + 
         RevisionType.ONLY_DATA_PROPERTY_MOD.getRepresentation() + ", " + 
         RevisionType.BOTH_COLLECTION_AND_PROPERTY_MOD.getRepresentation() + ", " + 
         RevisionType.ONLY_COLLECTION_PROPERTY_MOD.getRepresentation() + ", " + 
         RevisionType.DEL.getRepresentation() + 
        ") " + 
      "  and not ("+ 
        "ec.otherGroupEntityModified = false and " + 
        "ec.thisGroupEntityModified = true and " + 
        "ec.rowDataModified = false and " + 
        "ec.collectionOfNotGroupEntityModified = false " + 
       " ) " + 
      " ) " + 
      " group by ec.id, r.id " + 
      " having count(*) > :start" + 
      " order by r.id desc"; 

Cách khắc phục lỗi và tôi đang làm gì sai?

+2

cho những người tìm kiếm trong tương lai của câu hỏi này, trong trường hợp của tôi, tôi đã tham gia một thuộc tính không lười biếng. Khi tôi loại bỏ mệnh đề tham gia nó đã được giải quyết. – merveotesi

Trả lời

71

Sử dụng thường xuyên join thay vì join fetch (bằng cách này, nó inner theo mặc định):

String hql = " select ec.id as entityChangeId, r.id as revisionId from EntityChange as ec " + 
     " join ec.revision as r " + ... 

Như thông báo lỗi cho bạn, join fetch không có ý nghĩa ở đây, bởi vì đó là một gợi ý hiệu suất buộc háo hức tải bộ sưu tập.

+4

Chỉ cần làm rõ, 'tham gia tìm nạp' cũng có thể được sử dụng để buộc tải mong muốn của một liên kết chẳng hạn như một trường được chú thích bằng @ManyToOne và không chỉ các bộ sưu tập. –

+14

Hm .. Tôi đang đối mặt với một vấn đề tương tự, nhưng tôi cần phải thực hiện tìm nạp để tránh vấn đề n + 1 – Ievgen

+0

@levgen, tôi không biết chi tiết truy vấn của bạn nhưng, hãy nhớ rằng truy vấn đếm không nên có "lấy" ở tất cả. https://codingexplained.com/coding/java/spring-framework/fetch-query-not-working-spring-data-jpa-pageable#comment-293535 –