2014-02-14 74 views
0

我知道entityManager.find()方法可用于使用主键获取一行。JPA使用where子句选择行

但我有一个要求来定义一个普通的查找方法,它接受具有where子句条件的地图。在映射中,键将是列名,值将是where子句的列名值。此方法应返回选定行的列表。

有人可以帮我吗?

+0

您拥有哪个JPA版本? – VibrantVivek

回答

3

找到取主行的方向。现在如你所愿 “”通用的查找方法,它接受具有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是否methods.In该设计还可以通过java的逻辑已经定制方法为此去here阅读。

+0

我想我应该通过CriteriaBuilder来做到这一点,谢谢 – Ani

1

以下可能是矫枉过正,但是使用criteriaBuilder来处理它是一种相当通用的方法。虽然我无法将代码粘贴到此处(工作),但我创建了一个抽象BaseFilter <实体>类。

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

我们专门为getXX和setXXX工作,所以我们可以通过get(Entity1_.childObject).get(ChildObject_.grandChildObject)来引用元素以协助重构。 JPA也通过字符串名称支持它,所以你可以用它来实现getPredicates。

JPA在其调用中需要实际的Entity.class引用,试图获得它有点有趣。最终谷歌搜索转向了它。