Это похоже на вопрос, который я задавал ранее .Ответы на этот вопрос частично решили мою проблему, но у меня все еще есть некоторые проблемы при попытке выполнить поиск, который я там указал;кроме того, у меня просто возникают проблемы с пониманием того, как Hibernate выбирает, что возвращать в различных сценариях.
Вот мое отображение:
Client {
@OneToMany(mappedBy="client",cascade=CascadeType.ALL)
private Set<Group> groups = new HashSet<Group>();
}
Group {
@ManyToOne (cascade=CascadeType.ALL)
private Client client = new Client();
private String name;
private String state; //two char state code
private String extId; //unique identifier; candidate key, but not the @Id.
}
Запросы по имени встроены (например, как с подстановочными знаками наоба конца парама);состояние и extId равны.
Следующий запрос возвращает одного клиента, с присоединенной только соответствующей группой, даже если другие группы связаны с клиентом (обратите внимание, что extId вернет только одну группу):
select distinct client from Client as client
inner join client.groups as grp
where grp.extId = :extId
Этот запрос возвращает одного клиента, но с прикрепленными всеми связанными группами, независимо от того, соответствует ли код состояния группы критериям:
select distinct client from Client as client
inner join client.groups as grp
where grp.state= :state
Наконец, этот запрос возвращает отдельную копию клиента для каждой сопоставленной группы , и каждая копия содержит все связанные с ней группы независимо от того, соответствует ли имя группы критериям:
select distinct client from Client as client
inner join client.groups as grp
where grp.name like :name
Я новичок в Hibernate, и меня очень огорчает, что я не могу предсказать, что будет возвращено из данного запроса.Все три запроса почти идентичны, за исключением некоторых небольших изменений в предложении WHERE, но я получаю радикально разные результаты для каждого.Я потратил время на просмотр документации, но мне не хватает там, где объясняется такое поведение.Может ли кто-нибудь помочь пролить свет на это?
Наконец, мне действительно нужно вернуть Client
s при запросе по Group
, и клиент only содержитGroup
с, которые соответствуют критериям поиска.Есть ли один способ, которым я могу создать HQL-запрос для этого, или мне придется делать несколько запросов и строить свои объекты в коде?
Спасибо.