JPA createQuery或@NamedQuery

时间:2013-07-28 10:18:23

标签: 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(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?

任何见解,输入或帮助都非常值得赞赏。

1 个答案:

答案 0 :(得分:3)

基本上@NamedQuery就像typedQuery,typedQuery是创建查询的结果:

TypedQuery<USER> hql = entityManager.createQuery(query);

@NamedQuerytypedQuery之间的唯一区别是命名查询位于与代码不同的位置,并在创建会话工厂时进行检查。

性能问题的区别仅仅在于构建字符串,所以除非您的连接位于数百或数千个表中,否则您在这两个表中找不到任何差异。