Я пытаюсь получить Entity1
, запрашивая сопоставленные сущности к нему. Я использую CriteriaBuilder
, чтобы выполнить это, как показано ниже
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity1> createQuery = criteriaBuilder.createQuery(Entity1.class);
Root<Entity1> root = createQuery.from(Entity1.class);
Join<Entity1, MappedEntity2> mappedEntity2Join = root.join("mappedEntity2");
createQuery.select(root);
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get(COL_USER_ID), userId));
// where clause to filter by query params
createQuery.where(predicate).distinct(true);
createQuery.getRestriction();
TypedQuery<Entity1> query = entityManager.createQuery(createQuery);
Но в случайных случаях я обнаружил, что запрос был выполнен на «Entity2.entities1» без указания Entity2 в соединении. Я предполагаю, что Entity2 уже доступен в сессии, и он был лениво инициализирован с entity1. Из-за этого Критерии генерирует запрос для Entity2 вместо Entity1.
Есть ли способ ограничить критерии запроса на Entity1? или как удалить Entity2 из сеанса до выполнения этого конкретного критерия.
Ожидаемый запрос,
select *
from Entity1 obj1_
inner join mappedEntity1 mObj_ on obj1_.obj_id=mObj_.id
where obj1_.id=?
Но запрос был сгенерирован как
select *
from entities1_entities2 obj0_
inner join Entity1 obj1_ on obj0_.obj_id=obj1_.id
where obj0_.entity2_id=?
Структура сущностей:
public class Entity1 {
@ManyToOne
MappedEntity1 mappedEntity1;
@OneToMany
MappedEntity2 mappedEntity2;
@OneToMany
MappedEntity3 mappedEntity3;
}
и
public class Entity2 {
@OneToMany
List<Entity1> entities1;
@OneToOne
MappedEntity2 mappedEntity2;
}
Справочная таблица для Entity1 и Entity2
Имя таблицы: entity1_entities2
entity1_id INTEGER NOT NULL,
entity2_id INTEGER NOT NULL,
CONSTRAINT entities1_entities2_entity1_id_fkey FOREIGN KEY (entity1_id)
REFERENCES entity1 (id),
CONSTRAINT entities1_entities2_entity2_id_fkey FOREIGN KEY (entity2_id)
REFERENCES entity2 (id)