2012-05-11 6 views
4

Я следующие субъекты Hibernateотчетливый внутреннее соединение HQL

public class Container { 
    ... 

    @OneToMany 
    private List<ACLEntry> aclEntries; 
} 

Для обеспечения своих экземпляров контейнера я использую следующий объект:

public class ACLEntry { 

    ... 
    private Long sid; 
    private boolean principal; 
    private Integer mask; 

} 

В HQL-запросы будут создаваться автоматически, поэтому для поиска экземпляры контейнеров, следующий запрос будет создан:

select container from Container container 
inner join container.aclEntries as aclEntry 
with bitwise_and (aclEntry.mask, 1) = 1 and 
    (aclEntry.sid = :userId or aclEntry.sid = :roleId) 

Проблема заключается в том, что соединение aclentry может вернуть 2 результата, которые приведут к дублированию результатов контейнера.

Есть ли у кого-нибудь идеи, как это решить?

ответ

1

Насколько я понял проблему вам нужен контейнер, который может содержать несколько записей вашего объекта Container просто заменить HQL запрос следующим текстом:

С добавлением select distinct в качестве родного запроса.

+0

Мы используем внутренний механизм запросов для создания запросов hql, поэтому я не могу добавить разные, потому что это повлияет на все запросы. Я думаю, что отдельные должны применяться только к соединению, или я ошибаюсь? –

+0

+1. Это правильное и простое решение. Если механизм запроса не может его обработать, улучшите механизм запросов. –

0

В качестве решения грубой силы вы можете написать собственный запрос.

+0

мы используем внутренний механизм запросов для создания наших запросов hql, изменяя на собственные запросы, мы должны были бы изменить наш механизм запросов –

0

Это может иметь смысл написать это как запрос Критерии, который easily supports selecting an object based on conditions of it's associations.

То же самое можно сделать в HQL или в нативном запросе, может быть поучительно выполнить запрос Criteria с указанием той же логики и просто посмотреть, что он генерирует HQL/SQL.

+0

, как указано в документах, критерии api выполнили бы два запроса, а затем присоединяют результаты к третьему шагу; я думаю, что для этого случая он не будет выполнять достаточно для получения больших результатов, или я ошибаюсь? –

Смежные вопросы