2012-09-17 11 views
38

estoy seleccionando dos columnas id pero conseguir especificada de error:consulta especifica la recuperación por unión, pero el dueño de la asociación inverosímil no estaba presente en la lista de selecció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] 

Algunos código:

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ómo solucionar el error y qué estoy haciendo mal?

+2

para futuros buscadores de esta pregunta, en mi situación, me estaba uniendo a un atributo no perezoso. Cuando elimino la cláusula join fue resuelto. – merveotesi

Respuesta

71

uso regular join en lugar de join fetch (por cierto, es inner por defecto):

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

Como mensaje de error que dice, join fetch no tiene sentido aquí, porque es un indicio rendimiento que obliga ansiosos carga de la colección.

+4

Solo para aclarar, 'join fetch' también se puede usar para forzar la carga ansiosa de una asociación, como un campo anotado con @ManyToOne y no solo colecciones. –

+14

Hm .. Estoy enfrentando un problema similar, pero necesito hacer la búsqueda de join para evitar n + 1 problema – Ievgen

+0

@levgen, no sé detalles de su consulta, pero tenga en cuenta que la consulta de conteo no debería tener "buscar" en absoluto. https://codingexplained.com/coding/java/spring-framework/fetch-query-not-working-spring-data-jpa-pageable#comment-293535 –

Cuestiones relacionadas