Это может быть достигнуто с помощью двух 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.
Вот то, как я наконец достиг его с помощью 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.
Можно все еще использовать запись через точку для работы через отношения. Например, принятие Вас имеет свойство 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();
'Я не думаю эта попытка работать. Я хочу найти все лицензии, которые имеют и "Автомобиль" и "Мотоцикл"'
Пользователь Expression.and (....) вместо Expression.or (....) в отрывке, обеспеченном Nick
Я имел подобную проблему, но согласовал использование 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=?
Надежда это помогает.