我有一个实体商品,我需要在两个字段的组合上构建命名查询。
字段pr_id和of_id。
所以实际的查询看起来像
Select pr_id, of_id, a, b from Offers
where ( (pr_id=1 and of_id=2)
or (pr_id=2 and of_id=1)
or (pr_id=1 and of_id=2))
“和”基于其他结果而增加。最大10.但这个问题无关紧要。值显然是参数。
我需要调用库方法
findByNamedQuery( QueryName, Map<String, Object>) or
findByQuery(query)
无法更改上述方法。 如果我使用第一个,如果字段名称和动态参数名称在使用JPA的查询中重复,我不确定它是如何工作的。
例如,对于JPA,它看起来像这样:
map("pr_id",":pr_id");
map("of_id",":of_id");
map("pr_id",":pr_id");
map("of_id",":of_id");
map("pr_id",":pr_id");
map("of_id",":of_id");
所以我猜我只有第二个选项?使用实际值动态构建查询,与实际查询完全相同。
知道如何使用第一个吗?
答案 0 :(得分:0)
您打算如何构建查询?问题是如何填充参数映射,但这取决于您如何命名查询中的参数。对于您要查找的每个不同的值,您必须具有不同的参数名称。
据我所知,“OR”条件的数量是可变的,您不能使用静态的命名查询,因此您无法使用findByNamedQuery方法。
您可以使用JPQL动态构建查询字符串:
SELECT pr_id, of_id, a, b FROM Offers
WHERE((pr_id=:pr_id_1 and of_id=:of_id_1)
OR (pr_id=:pr_id_2 and of_id=:of_id_2)
OR (pr_id=:pr_id_3 and of_id=:of_id_3))
然后传递每个参数:
...
query.setParameter(pr_id_1, 4534);
query.setParameter(pr_id_2, 6368);
query.setParameter(pr_id_3, 2345);
...
或者您可以使用Criteria API以类型安全的方式构建动态查询