使用@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?任何洞察力、投入或帮助都是非常值得赞赏的。
发布于 2013-07-28 11:46:33
基本上,@NamedQuery和typedQuery一样,typedQuery是创建查询的结果:
TypedQuery<USER> hql = entityManager.createQuery(query);@NamedQuery和typedQuery之间唯一的区别是命名查询在与代码不同的位置上,并在创建会话工厂时进行检查。
性能问题的差异仅仅是构建字符串,所以除非您的联接位于上百个或数千个表中,否则您将不会发现这两个表之间的任何区别。
https://stackoverflow.com/questions/17907199
复制相似问题