Java 如何使用EntityManager和JPA减少CriteriaQuery的冗长
在本例中,我有一个保存到数据库中的Java 如何使用EntityManager和JPA减少CriteriaQuery的冗长,java,jpa,Java,Jpa,在本例中,我有一个保存到数据库中的Recipe对象列表,其中每个配方都有一个name类型为String的属性 我有一个RecipeManager,它提供了一个方法RecipeLookupByName(字符串名) 我已经阅读了一些关于CriteriaBuilder类的教程和文档,我找到了一个解决方案,但它似乎非常冗长: private static CriteriaQuery<Recipe> getNameQuery(EntityManager em) { Cr
Recipe
对象列表,其中每个配方都有一个name
类型为String
的属性
我有一个RecipeManager
,它提供了一个方法RecipeLookupByName(字符串名)
我已经阅读了一些关于CriteriaBuilder
类的教程和文档,我找到了一个解决方案,但它似乎非常冗长:
private static CriteriaQuery<Recipe> getNameQuery(EntityManager em) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Recipe> query = builder.createQuery(Recipe.class);
Root<Recipe> r = query.from(Recipe.class);
ParameterExpression<String> nameParam = builder.parameter(String.class, "name");
query.where(builder.equal(r.get("name"), nameParam));
query.select(r);
return query;
}
public Recipe lookupByName(String recipeName) {
try {
CriteriaQuery<Recipe> nameQuery = getNameQuery(this.em);
return this.em.createQuery(nameQuery).setParameter("name", recipeName).getSingleResult();
} catch (NoResultException ex) {
return null;
}
}
private静态标准查询getNameQuery(EntityManager em){
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(Recipe.class);
Root r=query.from(Recipe.class);
ParameterExpression nameParam=builder.parameter(String.class,“name”);
其中(builder.equal(r.get(“name”),nameParam));
查询。选择(r);
返回查询;
}
公共配方lookupByName(字符串recipeName){
试一试{
CriteriaQuery nameQuery=getNameQuery(this.em);
返回此.em.createQuery(nameQuery).setParameter(“name”,recipeName).getSingleResult();
}捕获(noresultex异常){
返回null;
}
}
这是使用JPA中的
EntityManager
框架进行简单查找的首选/正确方法吗?有没有什么可以减少的,或者我缺少的其他方法/构建器类可以让这变得不那么复杂?hello@Craig Otis!这似乎是使用CriteriaAPI的正确方法。无论您是否希望在此基础上进行构建并简化其某些语法,这取决于您。一开始可能看起来很冗长,但我的观点看起来很简洁,你的愿望是什么。你看过Query DSL@ArunM了吗?我没有,但我会的,谢谢你。我很犹豫是否要添加另一层,因为H2->Hibernate->JPA
已经离数据越来越远了。让我们面对现实,criteriaapi是可怕的。任何时候都可以给我QueryDSL。@AlanHay这是我第一次看到/使用它-它非常残忍。你好@Craig Otis!这似乎是使用CriteriaAPI的正确方法。无论您是否希望在此基础上进行构建并简化其某些语法,这取决于您。一开始可能看起来很冗长,但我的观点看起来很简洁,你的愿望是什么。你看过Query DSL@ArunM了吗?我没有,但我会的,谢谢你。我很犹豫是否要添加另一层,因为H2->Hibernate->JPA
已经离数据越来越远了。让我们面对现实,criteriaapi是可怕的。任何时候都可以给我QueryDSL。@AlanHay这是我第一次看到/使用它-它非常残忍。