Crear una consulta utilizando NO EXISTE en jpa criterios api

Tengo dos tablas denominadas como tabla1 ,tabla2.Tanto las tablas están teniendo el mismo número de campos.No hay ninguna relación entre estas dos tablas.Mi requisito es que quiero que todos los registros de la tabla1 que no existen en la tabla2. Así que he escrito una consulta utilizando los Criterios de la API. Pero no está dando el resultado correcto. Como soy nuevo en esto de JPA y criterios de la API, puede cualquier punto mí donde estoy haciendo mal.El siguiente código que estoy usando para ello.

CriteriaBuilder cb = mediationEntityManager.getCriteriaBuilder();
CriteriaQuery<Table1>  cq = cb.createQuery(Table1.class);
Root<Table1> table1 = cq.from(Table1.class);
cq.select(table1)

Subquery<Table2> subquery =  cq.subquery(Table2.class)
Root table2 = subquery.from(Table2.class)
subquery.select(table2)
cq.where(cb.not(cb.exists(subquery)))
TypedQuery<Table1> typedQuery = mediationEntityManager.createQuery(cq); 
List<Table1> resultList = typedQuery.getResultList();

Consulta De MySQL :

SELECT table1 
FROM   table1 table1 
WHERE  NOT EXISTS (SELECT table2 
                   FROM   table2 table2 
                   WHERE  table2.name = table1.name 
                          AND table2.education = table1.education 
                          AND table2.age = table1.age) 
       AND table1.name = 'san' 
       AND table1.age = '10'; 

Necesito el JPA criterios de la API de consulta para la citada consulta de MySQL.

Pero, ¿cómo diferenciar los datos entre estas tablas, especifique los criterios/columna etc
Hola muy gracias por dar la respuesta que me estoy dando a la actual consulta de mysql en mi Pregunta original.Plz mirar en él y si es posible me dan la jpa criterios de la api de consulta para la misma consulta de mysql.

OriginalEl autor aaaa | 2012-12-13

1 Kommentar

  1. 15

    Usted puede intentar el siguiente código con los Criterios de la API. Yo no lo he probado, pero se puede tratar de modificar el código en consecuencia.

    CriteriaBuilder cb = mediationEntityManager.getCriteriaBuilder();  
    CriteriaQuery<Table1> query = cb.createQuery(Table1.class); 
    Root<Table1> table1 =  query.from(Table1.class); 
    query.select(table1);
    //--  
    Subquery<Table2> subquery = query.subquery(Table2.class); 
    Root<Table2> table2 = subquery.from(Table2.class);  
    subquery.select(table2);  
    //--
    List<Predicate> subQueryPredicates = new ArrayList<Predicate>(); 
    subQueryPredicates.add(cb.equal(table1.get(Table1_.name), table2.get(Table2_.name)));
    subQueryPredicates.add(cb.equal(table1.get(Table1_.age), table2.get(Table2_.age)));
    subQueryPredicates.add(cb.equal(table1.get(Table1_.education), table2.get(Table2_.education)));
    subquery.where(subQueryPredicates.toArray(new Predicate[]{})); 
    //--
    List<Predicate> mainQueryPredicates = new ArrayList<Predicate>(); 
    mainQueryPredicates.add(cb.equal(table1.get(Table1_.name), "san");
    mainQueryPredicates.add(cb.equal(table1.get(Table1_.age), "10");
    mainQueryPredicates.add(cb.not(cb.exists(subquery))); 
    //--
    query.where(mainQueryPredicates.toArray(new Predicate[]{})); 
    TypedQuery<Table1> typedQuery =  mediationEntityManager.createQuery(query); 
    List<Table1> resultList = typedQuery.getResultList();

    También, usted puede tratar a continuación de consultas JPQL, que es más fácil de entender, alter & depuración.

    SELECT t1 
    FROM   table1 t1, 
           table2 t2 
    WHERE  t1.name = 'san' 
           AND t1.age = '10' 
           AND (t2.name <> t1.name 
                 AND t2.education <> t1.education 
                 AND t2.age <> t1.age); 
    Hey gracias mucho…se está trabajando muy bien.
    Eres bienvenido & el enfoque que has preferido
    Preferí criterios Api bcoz que es mi obligación.
    Hola, ¿Cómo puedo pasar el nombre de la tabla como dinámica para crear el método de Consulta.
    Usted puede tratar de createQuery(), no hay necesidad de mencionar la clase. También, puedes colocar los medicamentos genéricos(no me guste) & puede agregar condiciones para obtener resultados requeridos, fundición de objetos de la clase explícitamente

    OriginalEl autor Nayan Wadekar

Kommentieren Sie den Artikel

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

Pruebas en línea