JPA подзапрос из предложения - PullRequest
3 голосов
/ 10 января 2012

Мы разрабатываем веб-приложение, которое использует EJB для подключения к базе данных.

В нашей модели БД у нас есть таблица мобильных устройств, еще одна с функциями и последняя, ​​которая отображает значенияиз функций с моделями телефонов.Функции моделей (id_model, ...) (id_feature, ...) model_features (id_model, id_feature, value)

Мы хотим выполнить запрос, в котором модели упорядочены по количеству совпадающих объектов.Это значит, что мы передаем список соответствующих функций (т. Е. От 1 до 9) и хотим, чтобы все устройства содержали «да» в качестве значения хотя бы одной из этих функций, и упорядочиваем их, как было сказано ранее.

Мы создали SQL-запрос, который выполняет эту работу, и он работает:

SELECT CONCAT(subquery.numberf*100/9,"%") AS "Features", subquery.idModel AS "ID model"
FROM (select count(*) AS numberf, id_model AS idModel
        FROM model_features
        WHERE value LIKE '%Yes%' AND id_feature IN(1,2,3,4,5,6,7,8,9)
        GROUP BY id_model) subquery
WHERE subquery.numberf > 0
ORDER BY subquery.numberf DESC

Поскольку мы используем JPA и, следовательно, нам нужно строить JPQL-запросы, невозможно включить подзапросыв предложении FROM, и мы задаемся вопросом, можем ли мы «передать» подзапрос к предложению WHERE, возможно ли это и не повлияет ли это на производительность.Как мы можем сделать?

1 Ответ

2 голосов
/ 11 января 2012

Наконец, мы решили использовать собственный запрос:

 String query = "SELECT ROUND(subquery.numberf*100/" + features + ",0) AS \"matches\", m.id_model AS \"id_model\",  m.name AS \"name\", m.brand AS \"brand\", m.url_pict AS \"url_picture\""
                + " FROM (select count(*) AS numberf, id_model AS idModel FROM model_features WHERE value LIKE '%Yes%' "
                + "AND id_feature IN(" + idFeatures + ") GROUP BY id_model) subquery, Models m WHERE subquery.numberf > 0 "
                + "AND subquery.idModel = m.id_model ORDER BY subquery.numberf DESC, m.name";
return em.createNativeQuery(query).getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...