我们正在开发一个使用EJB连接到数据库的Web应用程序。
在我们的数据库模型中,我们有一个移动设备表,另一个有功能表,最后一个有手机模型映射功能值的表。模型(id_model,…)功能(id_feature,…)model_features(id_model,id_feature,值)
我们想要执行一个查询,以按匹配特征的数量对模型进行排序。就是说,我们传递了一个要匹配的功能列表(即从1到9),并且我们希望所有包含“ yes”的设备至少是其中一个功能的值,并按照先前的说明对其进行排序。
我们创建了一个执行该工作的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子句,而不能以不良的方式影响性能。我们该怎么办?
最后,我们使用本机查询解决了:
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();