JPA选择带有where子句的行

时间:2014-02-14 20:14:43

标签: java jpa

我知道entityManager.find()方法可以用来获取主键的行。

但是我需要定义一个公共的find方法,它接受一个具有where子句条件的map。在映射中,键将是列名称,值将是where子句的列名值。此方法应返回所选行的列表。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

看看:EntityManager.createQuery。如果我正确理解您的问题,这将允许您创建要执行的查询。你也可以看看使用CriteriaBuilder

答案 1 :(得分:1)

以下可能有点矫枉过正,但使用criteriaBuilder是一种相当通用的方法。虽然我不能在这里粘贴代码(工作),但我创建了一个抽象的BaseFilter< Entity>类。

然后,简单的部分就是让实现对象提供getXX,setXX属性。然后添加getPredicates()以返回谓词的ArrayList,然后抽象BaseDAO可以调用它来执行查询。

我们专门使用getXX和setXXX,因此我们可以通过例如get(Entity1_.childObject).get(ChildObject_.grandChildObject)来引用这些元素来协助重构。 JPA还通过字符串名称支持它,因此您可以使用它来实现getPredicates。

JPA在他们的调用中需要实际的Entity.class引用,尝试获取它是一件有趣的事情。最终谷歌搜索出现了问题。

答案 2 :(得分:1)

find取得主方面的行方面。现在你想要的 “通用查找方法,它接受具有where子句条件的映射。在映射中,键将是列名,值将是where子句的列名值。此方法应返回所选行的列表” 为此,你必须像这样使用CriteriaQuery:

以下简单Criteria查询返回数据源中Pet实体的所有实例:

EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.select(pet);
TypedQuery<Pet> q = em.createQuery(cq);
List<Pet> allPets = q.getResultList();

等效的JPQL查询是:

SELECT p FROM Pet p

此外,我建议您在实体中使用基于注释的映射。寻找二传手方法的getter。在该设计中,您也可以通过java逻辑自定义方法,以便将此here读取。{/ p>