Hibernate JPA createQuery或@NamedQuery
使用@NamedQuery的单个查询在单个行中获取结果更好还是使用createQuery更好 我在DAOImpl中有以下内容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
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出现错误时,应用程序将快速失败,而无需进行太多的单元测试。我觉得我的答案很清楚,他们两个并没有太大的区别,更不用说表现了。这类似于公共静态字符串变量与普通私有字符串变量的区别。