Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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
Hibernate JPA createQuery或@NamedQuery_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

Hibernate JPA createQuery或@NamedQuery

Hibernate JPA createQuery或@NamedQuery,hibernate,jpa,jpa-2.0,Hibernate,Jpa,Jpa 2.0,使用@NamedQuery的单个查询在单个行中获取结果更好还是使用createQuery更好 我在DAOImpl中有以下内容 CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Project> c = cb.createQuery(Project.class); Root<Project> prj = c.from(Project.class); c.orderBy(cb.desc

使用@NamedQuery的单个查询在单个行中获取结果更好还是使用createQuery更好

我在DAOImpl中有以下内容

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Project> c = cb.createQuery(Project.class);
Root<Project> prj = c.from(Project.class);
c.orderBy(cb.desc(prj.get("projectNo")));
c.select(prj);

CriteriaQuery<Long> countQ = cb.createQuery(Long.class);
Root<Project> prjCount = countQ.from(Project.class);
countQ.select(cb.count(prjCount ));

String projectNo = filters.get("projectNo");

List<Predicate> criteria = new ArrayList<Predicate>();
    if (projectNo != null) {
        ParameterExpression<String> pexp = cb.parameter(String.class,
            "projectNo");
    Predicate predicate = cb.like(prj.get(Project_.projectNo),
                    pexp);
            criteria.add(predicate);
        }
 if (criteria.size() == 1) {
    c.where(criteria.get(0));
        countQ.where(criteria.get(0));
    } else if (criteria.size() > 1) {
        c.where(cb.and(criteria.toArray(new Predicate[0])));
        countQ.where(cb.and(criteria.toArray(new Predicate[0])));
        }

 TypedQuery<Project> q = entityManager.createQuery(c);
 TypedQuery<Long> countquery = entityManager.createQuery(countQ);
在TypedQuery中,我可以使用createQuery或调用实体类中定义的createNamedQuery

我之所以使用createQuery,是因为我想根据过滤条件进行过滤并获得结果。然而,如果我使用createNamedQuery,那么我需要在@NamedQuery中添加一个where条件,最重要的是我需要检查筛选条件是否为null,如果为null,那么我使用某种类型的通配符,如%从数据库获取所有结果,这可能会导致延迟

所以我有两个疑问

使用createQuery来使用过滤器或搜索更好吗 实际上,通过执行多个基于 关于我的映射和联接

使用@NamedQuery并具有where条件和 只执行一个带有连接的sql

任何见解、输入或帮助都是非常值得欣赏的。

基本上@NamedQuery与typedQuery类似,typedQuery是create query的结果:

TypedQuery<USER> hql = entityManager.createQuery(query);
@NamedQuery和typedQuery之间的唯一区别是NamedQuery位于代码的不同位置,并在创建会话工厂时进行检查

性能问题的不同之处在于构建字符串,因此,除非您的联接位于100或数千个表中,否则您真的找不到这两者之间的任何差异。

基本上@NamedQuery与typedQuery类似,typedQuery是create query的结果:

TypedQuery<USER> hql = entityManager.createQuery(query);
@NamedQuery和typedQuery之间的唯一区别是NamedQuery位于代码的不同位置,并在创建会话工厂时进行检查


性能问题的不同之处在于构建字符串,因此,除非您的联接位于100或数千个表中,否则您真的不会发现这两个表之间有任何区别。

可能会有帮助。@Angga想知道,在@NamedQuery中,由于联接提取,当使用createQuery执行多个sql语句而不是单个sql时,它是否会有性能问题?可能会有帮助。@Angga在@NamedQuery的情况下,使用createQuery执行多个sql语句而不是一个sql语句时,是否会出现性能问题?Angga@NamedQuery和createQuery,而不是typedQuery:-我没有数百个表联接,少于10或15个。因此,我认为在@NamedQuery的情况下,无论是否执行一个查询,这都不会有任何性能问题,因为我已经定义了连接获取来连接表。虽然为了使用过滤条件,我正在使用createQuery.抱歉,也许我说的和我的代码示例不匹配。我说的是.createQuery的返回类型为TypedQuery,而.CreateNamedQuery也返回TypedQuery。因此,如果HQL是相同的,那么它们两个都有完全相同的SQL生成值,区别就在于它们得到字符串的位置。结果是一样的,但问题是哪一个更好。@NamedQuery可以在应用程序启动时进行预编译,在这种情况下效率会更高。是的,这是性能上的唯一区别,正如我在回答中所说,在创建会话工厂时会检查它,因此当@NamedQuery出现错误时,应用程序将快速失败,而无需进行太多的单元测试。我觉得我的答案很清楚,他们两个并没有太大的区别,更不用说表现了。这就像公共静态字符串变量与普通私有字符串变量的区别。Angga@NamedQuery和createQuery,而不是typedQuery:-我没有数百个表联接,少于10或15个。因此,我认为在@NamedQuery的情况下,无论是否执行一个查询,这都不会有任何性能问题,因为我已经定义了连接获取来连接表。虽然为了使用过滤条件,我正在使用createQuery.抱歉,也许我说的和我的代码示例不匹配。我说的是.createQuery的返回类型为TypedQuery,而.CreateNamedQuery也返回TypedQuery。因此,如果HQL是相同的,那么它们两个都有完全相同的SQL生成值,区别就在于它们得到字符串的位置。结果是一样的,但问题是哪一个更好。@NamedQuery可以在应用程序启动时进行预编译,在这种情况下效率会更高。是的,这是性能上的唯一区别,正如我在回答中所说,在创建会话工厂时会检查它,因此当@NamedQuery出现错误时,应用程序将快速失败,而无需进行太多的单元测试。我觉得我的答案很清楚,他们两个并没有太大的区别,更不用说表现了。这类似于公共静态字符串变量与普通私有字符串变量的区别。