Понимание HQL-запросов к объектам коллекции - PullRequest
0 голосов
/ 01 марта 2012

Это похоже на вопрос, который я задавал ранее .Ответы на этот вопрос частично решили мою проблему, но у меня все еще есть некоторые проблемы при попытке выполнить поиск, который я там указал;кроме того, у меня просто возникают проблемы с пониманием того, как 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-запрос для этого, или мне придется делать несколько запросов и строить свои объекты в коде?

Спасибо.

1 Ответ

1 голос
/ 01 марта 2012

Ответ на этот вопрос двоякий.Во-первых, возникла проблема с тестовым набором, который (разумно) использовал откат транзакции для создания тестовых экземпляров, не оставляя артефактов в базе данных.Это было источником моих странных ответов в запросах.

Мне удалось вернуть только те значения, которые я хотел получить в коллекциях, просто переключившись на внешнее соединение выборки.

...