使用“和”和相同的列名构建JPA查询

时间:2013-06-07 04:01:56

标签: java jpa dynamic

我有一个实体商品,我需要在两个字段的组合上构建命名查询。

字段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");

所以我猜我只有第二个选项?使用实际值动态构建查询,与实际查询完全相同。

知道如何使用第一个吗?

1 个答案:

答案 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以类型安全的方式构建动态查询