Ошибка «org.hibernate.QueryException: двойной путь ассоциации» (может потребоваться дважды включить таблицу) - PullRequest
0 голосов
/ 17 сентября 2018

Я использую Hibernate для реализации страницы поиска, где могут использоваться или не использоваться другие критерии. Одним из критериев является ID в SpecialTable. Другим критерием является "Or" в MainTable или SpecialTable. Все необязательно.

Предположим, я предоставляю оба критерия # 1 и # 2. В этом случае я хочу присоединиться к SpecialTable дважды отдельно с разными псевдонимами, потому что эти критерии не зависят друг от друга.

// Optional Criterion #1
if (searchCriteria.getSpecialId() != null) {
    criteriaQuery.createAlias("specialTable", "specialTableJoin1", JoinType.INNER_JOIN);
    criteriaQuery.add(Restrictions.eq("specialTableJoin1.id", searchCriteria.getSpecialId()));
}   

// ...

// Optional Criterion #2
if (!StringUtils.isBlank(searchCriteria.getRequestPublicationTitle())) {

    criteriaQuery.createAlias("specialTable", "specialTableJoin2", JoinType.LEFT_OUTER_JOIN);

    String titleForQuery = "%" + searchCriteria.getRequestPublicationTitle().replaceAll("^.*,", "").trim() + "%";
    Disjunction requestOrPublicationTitle = Restrictions.disjunction();
    requestOrPublicationTitle.add(Restrictions.ilike("title", titleForQuery));
    requestOrPublicationTitle.add(Restrictions.ilike("specialTableJoin2.publicationTitle", titleForQuery));

ОШИБКА:

org.hibernate.QueryException: duplicate association path: specialTable

Есть какие-нибудь решения? Мои псевдонимы разные, но все равно не работает.

1 Ответ

0 голосов
/ 17 сентября 2018

Это старая ошибка Hibernate - https://hibernate.atlassian.net/browse/HHH-879 - все еще открытая с 2005 года!

Единственное решение - определить все псевдонимы заранее , а не для каждого используемого критерия.Но это может быть проблемой, если при создании псевдонима используются разные типы JoinType (INNER или LEFT_OUTER_JOIN).Если это все тот же JoinType, то вы настроены.

Обходной путь, с которым я пошел, - определить общий LEFT_OUTER_JOIN, где требовались оба INNER / LEFT_OUTER_JOIN.Левое соединение по-прежнему работает с критерием # 1, поскольку оно ограничено значением Value = ..., поэтому нет реального отличия от первоначального внутреннего соединения.

// Prepare aliases (joins)
// -----------------------
if (searchCriteria.getSpecialId() != null || !StringUtils.isBlank(searchCriteria.getTitle())) {
    // Note: LEFT JOIN for both Special ID and Title,
    // since Hibernate Criteria API only allows 1 alias & join per Table (https://hibernate.atlassian.net/browse/HHH-879), and the 2nd criterion requires a Left Outer Join
    criteriaQuery.createAlias("specialTable", "st", JoinType.LEFT_OUTER_JOIN);                                                  
}
// ... All other aliases prepared ...

// Actual Criteria
// ... use the "st" single alias
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...