Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用EntityManager和JPA减少CriteriaQuery的冗长_Java_Jpa - Fatal编程技术网

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这是我第一次看到/使用它-它非常残忍。