У меня есть этот объект:
public Entity {
@JoinTable(name = "entity_equivalents",
joinColumns = {
@JoinColumn(name = "entity_new")},
inverseJoinColumns = {
@JoinColumn(name = "entity_old")})
@OneToMany
private Set<Entity> equivalents;
Я пытался создать CriteriaQuery, где я выбираю эквиваленты из сущности, я не могу понять, как создать CriteriaQuery
public Set<Entity> findEquivalents(Entity p1) {
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
// HERE is the problem
CriteriaQuery<Set<Entity>> query = cb.createQuery(); // <----
Root<Entity> root = query.from(Entity.class);
Expression<Set<Entity>> exx= root.get(Entity_.equivalents);
query.select(exx);
query.where(cb.equal(root.get(Entity_.id), p1.getId()));
return em.createQuery(query).getSingleResult();
}
Я не хочу делать атрибут FetchType.EAGER
или оставлять EM открытым и загружать загрузку при использовании экземпляра, например enti.getEquivalents();
Временное решение (пока кто-нибудь не поведет меня раскрыть тайны CriteriaQuery):
return new HashSet<>(getEntityManager()
.createQuery("SELECT o.equivalents from Entity o where o.id=" + id)
.getResultList());