我们正在开发一个使用EJB连接数据库的Web应用程序。
在我们的数据库模型中,我们有一个移动设备表,另一个具有功能,最后一个用功能模型映射功能的值。 models(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子句中包含subquerys,我们想知道是否 我们可以将子查询“传递”到WHERE子句,但不会以不良方式影响性能。我们该怎么办?
答案 0 :(得分:2)
最后,我们使用原生查询解决了问题:
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();