Запросы отношений ManyToMany с В спящем режиме Критерии

Это может быть достигнуто с помощью двух JOIN в Таблице B, например:

SELECT
    ta.id,
    ta.date,
    ta.etc,
    tb.value Name,
    td.value DOB
FROM
    tableA ta
    INNER JOIN tableB tb ON tb.table_a_id = tb.id AND tb.key = 'Name'
    INNER JOIN tableB td ON td.table_a_id = ta.id AND td.key = 'DOB'

В этом запросе будут отображаться только записи, которые имеют имя и DOB в таблице B. Если вы хотите избежать фильтрации этих «неполных» записей, вы можете использовать LEFT JOIN вместо INNER JOIN.

10
задан Daniel Alexiuc 12 November 2008 в 02:15
поделиться

4 ответа

Вот то, как я наконец достиг его с помощью HQL:

public List<DriversLicence> findDriversLicencesWith(List<LicenceClass> licenceClasses) {
    String hqlString = "select dl from DriversLicenceImpl dl where 1=1 ";
    for (int i = 0; i < licenceClasses.size(); i++) {
        hqlString += " and :licenceClass" + i + " = some elements(dl.licenceClasses)";
    }

    Query query = getSession().createQuery(hqlString);
    for (int i = 0; i < licenceClasses.size(); i++) {
        query.setParameter("licenceClass" + i, licenceClasses.get(i));
    }
    return query.list();
}

Или использование В спящем режиме Критерии с sqlRestriction:

for (LicenceClass licenceClass : licenceClasses) {               
    criteria.add(Restrictions.sqlRestriction("? = some(select " + LicenceClass.PRIMARY_KEY + " from " +
                    LICENCE_CLASS_JOIN_TABLE + "  where {alias}." +
                    DriversLicence.PRIMARY_KEY + " = " + DriversLicence.PRIMARY_KEY + ")",
                    licenceClass.getId(), Hibernate.LONG));
}

LICENCE_CLASS_JOIN_TABLE является названием таблицы, которые в спящем режиме, генерирует для поддержки many-many отношений между driversLicence и LicenceClass.

6
ответ дан 4 December 2019 в 03:39
поделиться

Можно все еще использовать запись через точку для работы через отношения. Например, принятие Вас имеет свойство DriversLicence.licenceClass и свойство LicenceClass.type, затем:

session.createCriteria(DriversLicence.class)
   .add(Expression.or(
     Expression.eq("licenceClass.type", "Car"),
     Expression.eq("licenceClass.type", "Motorbike")
   )
).list();

Лично, хотя, я просто избегал бы использования критериев в этом случае, потому что это не динамический запрос, но вместо этого используйте:

session.createQuery("from DriversLicence where licenceClass.type in (:types)")
  .setParameterList("types", myListOfTypes)
  .list();
0
ответ дан 4 December 2019 в 03:39
поделиться

'Я не думаю эта попытка работать. Я хочу найти все лицензии, которые имеют и "Автомобиль" и "Мотоцикл"'

Пользователь Expression.and (....) вместо Expression.or (....) в отрывке, обеспеченном Nick

-1
ответ дан 4 December 2019 в 03:39
поделиться

Я имел подобную проблему, но согласовал использование HQL, у меня есть класс "Предприятие", которое связано с классом "Пользователь" и также связано с классом "Роль", они сушат сено многие многим отношения, когда мне нужны все предприятия, связанные с определенным пользователем, я делаю следующее;

Select e from Enterprise As e inner join e.Users As u inner join u.Roles As r 
Where u.UserCode=?

Я предполагаю, что в Вашем случае необходимо сделать что-то как;

Select dl from LicenceClass As l inner join l.DriversLicences As dl
Where 
l.LicenseClass.Name = ? OR 
l.LicenseClass.Name=? OR 
l.LicenseClass.Name=?

Надежда это помогает.

0
ответ дан 4 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: