Esta es la pregunta más a esto:

Cómo utilizar JPA API de Criterios en UNIRSE

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery<Company> criteria = criteriaBuilder.createQuery( Company.class );
Root<Company> companyRoot = criteria.from( Company.class );
Join<Company,Product> products = companyRoot.join("dentist");
Join<Company, City> cityJoin = companyRoot.join("address.city");//Company->Address->City-city
criteria.where(criteriaBuilder.equal(products.get("category"), "dentist"),      criteriaBuilder.equal(cityJoin.get("city"),"Leeds"));

Una empresa tiene una dirección, dentro de la dirección no es la Ciudad-pojo y el País-Pojo. Cómo puedo usar en JOIN? Traté de hacer referencia a él con address.city pero me salió el mensaje de error:

El atributo [dirección.la ciudad] en el tipo administrado
[[email protected]:Company [ javaType: clase
com.prueba.dominio.Empresa descriptor:
RelationalDescriptor(com.prueba.dominio.La compañía –>
[DatabaseTable(EMPRESA)]), asignaciones: 16]] no está presente.

OriginalEl autor Sami | 2012-01-26

1 Comentario

  1. 22

    Si uso canónico Metamodelo, podrás evitar este tipo de errores.
    En el código se han hecho mal uso del «dentista» palabra clave, que es probablemente la causa de su error, porque «dentista», no es un campo en Compañía de la entidad.

    Sin embargo, analizando cómo se define la clase a la otra pregunta, la forma de definir que join utilizando el Metamodelo es este:

    SetJoin<Company,Product> products = companyRoot.join(Company_.products); 

    Como se puede ver, el Metamodelo evita el uso de cadenas, y lo que se evita una gran cantidad de errores de tiempo de ejecución. Si de todos modos no uso del Metamodelo, intente esto:

    SetJoin<Company,Product> products = companyRoot.join("products"); 

    Si ahora quieres añadir un predicate, es decir, algo después de la where, voy a escribir algo como:

    Predicate predicate = criteriaBuilder.equal(products.get(Product_.category), "dentist");
    criteria.where(predicate);

    Si quieres añadir un join para la Ciudad de entidad:

    Join<Company, City> city = companyRoot.join(Company_.city);
    predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(city.get(City_.cityName), "Leeds");
    criteria.where(predicate);

    (suponiendo que el campo cityName es el nombre de campo correcto para su ciudad).

    OriginalEl autor perissf

Dejar respuesta

Please enter your comment!
Please enter your name here