使用@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
来使用过滤器或搜索是否更好?
有效地,通过执行多个基于sql的语句
在我的映射和加入?
使用@NamedQuery
是否更好并且具有where条件和
只执行一个带连接的SQL?
任何见解,输入或帮助都非常值得赞赏。
答案 0 :(得分:3)
基本上@NamedQuery
就像typedQuery
,typedQuery是创建查询的结果:
TypedQuery<USER> hql = entityManager.createQuery(query);
@NamedQuery
和typedQuery
之间的唯一区别是命名查询位于与代码不同的位置,并在创建会话工厂时进行检查。
性能问题的区别仅仅在于构建字符串,所以除非您的连接位于数百或数千个表中,否则您在这两个表中找不到任何差异。