0

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

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

所以我想我只有第二个选择?使用实际值动态构建查询,就像实际查询一样。

知道如何使用第一个吗?

4

1 回答 1

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

于 2013-06-07T15:23:32.457 回答