Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA2条件查询,用于选择表A中未在表B中找到引用的记录_Java_Spring_Postgresql_Jpa 2.0 - Fatal编程技术网

Java JPA2条件查询,用于选择表A中未在表B中找到引用的记录

Java JPA2条件查询,用于选择表A中未在表B中找到引用的记录,java,spring,postgresql,jpa-2.0,Java,Spring,Postgresql,Jpa 2.0,我有以下结构的表格 Table A { id <-- Primary key someColumn } Table B { id <-- Primary key someColumn idOfA <-- Foreign key mapping to Table A } 到目前为止,我所做的是 public List<A> getANotInB() { CriteriaBuilder criteriaBuilde

我有以下结构的表格

Table A {
    id <-- Primary key
    someColumn 
}

Table B {
    id <-- Primary key
    someColumn 
    idOfA <-- Foreign key mapping to Table A
}
到目前为止,我所做的是

public List<A> getANotInB() {
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();


    // Select From Table B
    CriteriaQuery<B> criteriaQueryB = criteriaBuilder
            .createQuery(B.class);
    Root<B> rootB = criteriaQueryB.from(B.class);
    criteriaQueryB.select(rootB);

    // Select records from Table A
    CriteriaQuery<A> criteriaQueryA = criteriaBuilder.createQuery(A.class);
    Root<A> rootA = criteriaQueryA.from(A.class);
    criteriaQueryA.select(A);

    // Create predicate   
    Predicate predicate = rootAttemptA.in(criteriaQueryB.getSelection());
    criteriaQueryA.where(criteriaBuilder.not(predicate));

    // Create query

    TypedQuery<A> query = entityManager.createQuery(criteriaQueryA);
    List<A> as= query.getResultList();
    System.out.println(as);
    return as;
}
public List getANotInB(){
CriteriaBuilder CriteriaBuilder=entityManager.getCriteriaBuilder();
//从表B中选择
CriteriaQuery criteriaQueryB=criteriaBuilder
.createQuery(B.class);
根rootB=标准查询B.from(B.class);
criteriaQueryB.select(rootB);
//从表A中选择记录
CriteriaQuery criteriaQueryA=criteriaBuilder.createQuery(A.class);
根rootA=criteriaQueryA.from(A.class);
选择(A);
//创建谓词
谓词谓词=rootAttemptA.in(criteriaQueryB.getSelection());
其中(criteriaBuilder.not(谓词));
//创建查询
TypedQuery query=entityManager.createQuery(criteriaQueryA);
List as=query.getResultList();
系统输出打印项次(as);
返回为;
}
我知道上面的代码是不正确的,我有很多基础知识。 好心帮忙

注意:我想使用JPA2标准查询

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();

    // Select distinct aid from B
    CriteriaQuery<B> bQuery = cb.createQuery(B.class);
    Root<B> bRoot = bQuery.from(B.class);
    bQuery.select(bRoot.get("a").get("id")).distinct(true);

    // Select * from A where aid not in ()
    CriteriaQuery<A> aQuery = cb.createQuery(A.class);
    Root<A> aRoot = aQuery.from(A.class);
    aQuery.select(aRoot).where(cb.not(aRoot.get("id").in(bQuery)));

    TypedQuery<A> query = entityManager.createQuery(aQuery);
    List<A> result = query.getResultList();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
//从B中选择不同的援助
CriteriaQuery bQuery=cb.createQuery(B.class);
根bRoot=bQuery.from(B.class);
bQuery.select(bRoot.get(“a”).get(“id”)).distinct(true);
//从不在()中的where aid中选择*

CriteriaQuery

我可以使用subquery()完成它,如下所示。发布它以便帮助他人

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

// select a from A a 
CriteriaQuery<A> queryA = criteriaBuilder.createQuery(A.class);
Root<A> rootA = queryA.from(A.class);
queryA.select(rootA);

// Select distinct aId from B
CriteriaQuery<B> subQueryB = queryA.subquery(B.class);
Root<B> rootB = subQueryB.from(B.class);
bQuery.select(rootB.get("a")).distinct(true);

queryA.where(criteriaBuilder.not(criteriaBuilder.in(rootA.get("id").value(subQueryB))));

TypedQuery<A> query = entityManager.createQuery(aQuery);
List<A> result = query.getResultList();
CriteriaBuilder-CriteriaBuilder=entityManager.getCriteriaBuilder();
//从中选择一个
CriteriaQuery queryA=criteriaBuilder.createQuery(A.class);
根rootA=queryA.from(A.class);
queryA.select(rootA);
//从B中选择不同的援助
CriteriaQuery subQueryB=queryA.subquery(B.class);
根rootB=子查询B.from(B.class);
bQuery.select(rootB.get(“a”)).distinct(true);
where(criteriaBuilder.not(criteriaBuilder.in(rootA.get(“id”).value(subQueryB)));
TypedQuery=entityManager.createQuery(aQuery);
List result=query.getResultList();

谢谢@Mạnh为了显示方式

显示您的A和B类,在您可以加入JPA CriteriaAdded Entity classesI之前,应该配置映射,但CriteriaQuery subQueryB=queryA.subquery(B.class);在我看来是不对的。它必须在子查询上赋值
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();

    // Select distinct aid from B
    CriteriaQuery<B> bQuery = cb.createQuery(B.class);
    Root<B> bRoot = bQuery.from(B.class);
    bQuery.select(bRoot.get("a").get("id")).distinct(true);

    // Select * from A where aid not in ()
    CriteriaQuery<A> aQuery = cb.createQuery(A.class);
    Root<A> aRoot = aQuery.from(A.class);
    aQuery.select(aRoot).where(cb.not(aRoot.get("id").in(bQuery)));

    TypedQuery<A> query = entityManager.createQuery(aQuery);
    List<A> result = query.getResultList();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

// select a from A a 
CriteriaQuery<A> queryA = criteriaBuilder.createQuery(A.class);
Root<A> rootA = queryA.from(A.class);
queryA.select(rootA);

// Select distinct aId from B
CriteriaQuery<B> subQueryB = queryA.subquery(B.class);
Root<B> rootB = subQueryB.from(B.class);
bQuery.select(rootB.get("a")).distinct(true);

queryA.where(criteriaBuilder.not(criteriaBuilder.in(rootA.get("id").value(subQueryB))));

TypedQuery<A> query = entityManager.createQuery(aQuery);
List<A> result = query.getResultList();