JPA 2 No explícitos de selección y una implícita frío no se puede determinar

Estoy tratando de recuperar 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 vidas en una nueva tabla.

Esta es la consulta que se me ocurrió pero thorws la excepción

No explícitos de selección y una implícita frío no se puede determinar con

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;
}

Alguien sabe por qué esto no está funcionando?

OriginalEl autor Farouk Alhassan | 2011-04-18

2 Kommentare

  1. 8

    Yo tenía exactamente el mismo error hoy. Lo curioso es que me agarró de mi ejemplo de Hibernación 3.6.3.Final docs. 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. Nota: he tenido que crear una de las causas para solucionar 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é implícita una selección que no podía hacerse. En modo de Hibernación el ejemplo de la única clase que se utiliza es Person.class. Voy a actualizar mi respuesta cuando me profundizar un poco más.

    La primera consulta de la hibernación docs podría generar una consulta SQL similar a la de los hombres de SELECT.*, las mujeres.* DE la persona como de los hombres, de la persona como de las mujeres, con los hombres.sexo = ‘MASCULINO’ Y los hombres.relationship_status = ‘SINGLE’ Y las mujeres.sexo= «MUJER» Y las mujeres.relationship_status = ‘SINGLE’. Se va a volver una fila por cada Macho/Hembra combinación, y de hibernación, no sabe qué columnas que en realidad están tratando de seleccionar a cabo (las masculinas? mujeres? alguna combinación?) debido a que las tablas tienen la superposición de nombres de columna (todas las columnas en este caso se superponen)

    OriginalEl autor Jorge

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...