У меня есть следующие таблицы со следующей структурой
Table A {
id <-- Primary key
someColumn
}
Table B {
id <-- Primary key
someColumn
idOfA <-- Foreign key mapping to Table A
}
Классы сущностей выглядят как показано ниже
@Entity
@Table(name = "A")
public class A implements Serializable {
private static final long serialVersionUID = -78448557049178402L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
.......
.......
@OneToMany(mappedBy = "a")
private List<B> bs = new ArrayList<>();
}
@Entity
@Table(name = "B")
public class B implements Serializable {
private static final long serialVersionUID = -659500557015441771L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
.......
.......
@OneToOne
@JoinColumn(name = "a_id", nullable = false)
private A a;
}
Используя JPA2, я хочу выбрать записи из таблицы A, которые не имеют ссылки в таблице B.
Ожидаемый собственный запрос postgres
select * from A a
where a.id not in
(select b.idOfA from B b);
Что мне до сих пор удавалось сделать, это
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;
}
Я знаю, что приведенный выше код неверен, и у меня много основ вонг.
Пожалуйста, помогите
Примечание: я хочу использовать JPA2 Criteria Query