2

使用单个查询使用@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,那么我需要在其中添加一个 where 条件,@NamedQuery最重要的是我需要检查过滤条件是否为 null,如果它为 null,那么我使用某种通配符,例如%从数据库中获取所有结果这可能会导致延迟。

所以我有两个疑问

  • 使用过滤器或有效搜索是否更好createQuery,通过执行多个基于我的映射和连接的 sql 语句?

  • 使用@NamedQuery并具有 where 条件并仅执行一个带有连接的 sql 会更好吗?

任何见解或输入或帮助都是非常可观的。

4

1 回答 1

4

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

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

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

性能问题差异只是关于构建字符串,因此除非您的连接在数百或数千个表中,否则您真的不会发现这两者有任何区别。

于 2013-07-28T11:46:33.373 回答