2011-04-18 13 views
9

Estoy tratando de buscar a todos los usuarios de una carpeta donde el usuario fue creado después de una fecha determinada. la relación entre el usuario y la carpeta vive en una mesa separada.JPA 2 No se ha determinado ninguna selección explícita ni implícita fría

Ésta es la pregunta que se me ocurrió pero thorws la excepción

ninguna selección explícita y una implícita una fría no se puede determinar

El código

@Override 
public List<RetailPostUserTbl> getNewUsersForSiteSince(Date date, Integer siteId) 
{ 
    List<RetailPostUserTbl> toReturn = new ArrayList<RetailPostUserTbl>(); 
    EntityManager em = getEntityManager(); 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 

    Class<RpUserFolderMapTbl> userFolderPC = userFolderMapDAO.getPersistentClass(); 

    CriteriaQuery<RpUserFolderMapTbl> mapQuery = cb.createQuery(userFolderPC); 
    Root<RpUserFolderMapTbl> root = mapQuery.from(userFolderPC); 
    Path<Integer> folderIdPath = root.get(RpUserFolderMapTbl_.folder).get(FolderTbl_.folderId); 

    Predicate folderCondition = cb.equal(folderIdPath, siteId); 

    Subquery<RetailPostUserTbl> rpSubQ = mapQuery.subquery(persistentClass); 
    Root<RetailPostUserTbl> subQRoot = rpSubQ.from(persistentClass); 
    Path<UserTbl> userPath = subQRoot.get(RetailPostUserTbl_.user); 
    Path<Date> userCreatedPath = userPath.get(UserTbl_.userCreateDate); 
    Predicate userCreateDateCondition = cb.greaterThanOrEqualTo(userCreatedPath, date); 
    rpSubQ.where(userCreateDateCondition); 

    mapQuery.where(cb.and(folderCondition, cb.exists(rpSubQ))); 

    TypedQuery<RpUserFolderMapTbl> query = em.createQuery(mapQuery); 
    List<RpUserFolderMapTbl> results = query.getResultList(); 
    for (RpUserFolderMapTbl result : results) 
    { 
     RetailPostUserTbl rpuser = result.getUser().getRetailPostUser(); 
     toReturn.add(rpuser); 
    } 
    return toReturn; 
} 

Cualquiera ¿Sabes por qué esto no está funcionando?

Respuesta

8

Tuve exactamente el mismo error hoy. Lo curioso es que agarré mi ejemplo de Hibernate 3.6.3. Documentos finales. Su ejemplo es:

CriteriaQuery query = builder.createQuery(); 
Root<Person> men = query.from(Person.class); 
Root<Person> women = query.from(Person.class); 
Predicate menRestriction = builder.and(
    builder.equal(men.get(Person_.gender), Gender.MALE), 
    builder.equal(men.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
Predicate womenRestriction = builder.and(
    builder.equal(women.get(Person_.gender), Gender.FEMALE), 
    builder.equal(women.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
query.where(builder.and(menRestriction, womenRestriction)); 

Lo que hice para "corregir" el error es seleccionar explícitamente la raíz. Tenga en cuenta que tuve que crear una raíz para resolver esto. Aquí está mi ejemplo:

CriteriaQuery query = builder.createQuery(); 
Root<Person> personRoot = query.from(Person.class); 
Predicate menRestriction = builder.and(
    builder.equal(personRoot.get(Person_.gender), Gender.MALE), 
    builder.equal(personRoot.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
Predicate womenRestriction = builder.and(
    builder.equal(personRoot.get(Person_.gender), Gender.FEMALE), 
    builder.equal(personRoot.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
query.select(personRoot); 
query.where(builder.and(menRestriction, womenRestriction)); 

Lo que no puedo entender es por qué no se pudo realizar una selección implícita. En el ejemplo de Hibernate, la única clase que se utiliza es Person.class. Actualizaré mi respuesta cuando investigo un poco más.

18

Debe establecer explícitamente la selección también para "subconsultas".

rpSubQ.select(subQRoot); 

¡Buena suerte!

Cuestiones relacionadas