Ошибка пути повторения ассоциации в Hibernate - PullRequest
1 голос
/ 09 мая 2011

Я столкнулся с проблемой при попытке программно построить объект Criteria на основе критериев поиска пользователя.Проще говоря, пользователь может ввести один или несколько критериев поиска, и на основе того, что они вводят, я создаю объект Criteria, выполняю запрос на его основе и отображаю результаты.К сожалению, когда я использую определенные критерии поиска вместе, я получаю эту ошибку:

повторяющийся путь ассоциации: назначения

В моей базе данных есть таблица с проблемами (называемая Проблема).К проблеме может быть назначено несколько человек в разных ролях (например, ей могут быть назначены аудитор и специалист по обеспечению качества).Назначения хранятся в отдельной таблице, называемой Назначение.Таблицы выглядят примерно так:

+-------------+    +-----------------+
| Issue       |    | Assignment      |
+-------------+    +-----------------+
| issueID     |    | assignmentID    |
+-------------+    | issueID         |
                   | assigneeID      |
                   | isActive        |
                   | reviewType      |
                   +-----------------+

Столбец IssueID является первичным ключом в Issue и внешним ключом в Assignment.

В моем коде Java у меня есть что-то вроде этого:

public List<MortalityCase> searchCases(SearchCriteria criteria)
{
    Criteria search = HibernateUtil.getSession().createCriteria(Issue.class);

    if ( criteria.getIssueNumber() != null )
    {
        search.add(Restrictions.eq("issueNumber", criteria.getIssueNumber()));
    }

    ...

    if ( criteria.getAuditor() != null )
    {
        search.createCriteria("assignments")
            .add(Restrictions.eq("assignee", criteria.getAuditor()))
            .add(Restrictions.eq("isActive", "Y"))
            .add(Restrictions.eq("reviewType", getReviewType(TypeOfReview.AUDITOR)));
    }
    if ( criteria.getQASpecialist() != null )
    {
        search.createCriteria("assignments")
            .add(Restrictions.eq("assignee", criteria.getQASpecialist()))
            .add(Restrictions.eq("isActive", "Y"))
            .add(Restrictions.eq("reviewType", getReviewType(TypeOfReview.QA_SPECIALIST)));
    }

    ...

    return search.list();
}

Это прекрасно работает, если пользователь ищет проблемы, назначенные либо аудитору, либо специалисту по контролю качества.Однако, если пользователь пытается найти проблему, назначенную как данному Аудитору, так и данному Специалисту по контролю качества, я получаю сообщение об ошибке, упомянутое выше.

Я нашел эту тему на форумах Hibernateкоторый был запущен 7 лет назад и указывает на то, что это ограничение для Hibernate.Я надеялся, что с тех пор что-то было бы сделано с этим, но поток фактически оставался «живым» до июня 2010 года без упоминания ответа / исправления.

Есть ли способ сделать то, что япытаясь достичь здесь?

1 Ответ

0 голосов
/ 09 мая 2011

Если оба значения getAuditor() и getQASpecialist() не равны NULL, то не то, что вам действительно нужно, это выполнить запрос, в котором значение assignee равно criteria.getAuditor() ИЛИ criteria.getQASpecialist()?

например:

if ( criteria.getAuditor() != null && criteria.getQASpecialist() != null) {
     search.createCriteria("assignments")
        .add(Restrictions.or(
             Restrictions.eq("assignee", criteria.getAuditor()),
             Restrictions.eq("assignee", criteria.getQASpecialist())
         )
       ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...