JPA2 CriteriaQuery空结果

时间:2013-02-08 18:07:27

标签: java jpa-2.0 criteria-api

此代码使用JPA2条件查询返回空结果列表:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<VwReplPrevia> query = criteriaBuilder.createQuery(VwReplPrevia.class);
Root<VwReplPrevia> root = query.from(VwReplPrevia.class);
query.multiselect(root.get(VwReplPrevia_.codigoCentroCustos), 
            root.get(VwReplPrevia_.numeroCartaoPostagem),
            root.get(VwReplPrevia_.codigoServico),
            root.get(VwReplPrevia_.quantidadeItems),
            root.get(VwReplPrevia_.valorServico));
TypedQuery<VwReplPrevia> typedQuery = getEntityManager().createQuery(query);
String contrato       = StringUtils.trim(paginador.getEntityBean().getContrato());
String centroCustos   = StringUtils.trim(paginador.getEntityBean().getCentroCustos());
String cartaoPostagem = StringUtils.trim(paginador.getEntityBean().getCartaoPostagem());
String servico        = StringUtils.trim(paginador.getEntityBean().getServico());
query.where(criteriaBuilder.equal(root.get(VwReplPrevia_.numeroContrato), contrato));
    if (StringUtils.isNotBlank(centroCustos)) {
        criteriaBuilder.and(criteriaBuilder.equal(root.get(VwReplPrevia_.codigoCentroCustos), "9912231583"));
    }
    if (StringUtils.isNotBlank(cartaoPostagem)) {
        criteriaBuilder.and(criteriaBuilder.equal(root.get(VwReplPrevia_.numeroCartaoPostagem), cartaoPostagem));
    }
    if (StringUtils.isNotBlank(servico)) {
        criteriaBuilder.and(criteriaBuilder.equal(root.get(VwReplPrevia_.codigoServico), servico));
    }

    query.orderBy(criteriaBuilder.asc(root.get(VwReplPrevia_.codigoCentroCustos)));
    query.groupBy(root.get(VwReplPrevia_.codigoCentroCustos), 
            root.get(VwReplPrevia_.numeroCartaoPostagem), 
            root.get(VwReplPrevia_.codigoServico),
            root.get(VwReplPrevia_.quantidadeItems),
            root.get(VwReplPrevia_.valorServico));
List<VwReplPrevia> resultado = typedQuery.getResultList();

使用本机查询的相同查询返回相关的结果数。

String sql = "SELECT vwreplprev0_.sdan8  AS col_0_0_, " +
   "vwreplprev0_.sdcnid AS col_1_0_, " +
   "vwreplprev0_.sdlitm AS col_2_0_, " +
   "vwreplprev0_.sduorg AS col_3_0_, " +
   "vwreplprev0_.sdaexp AS col_4_0_ "  +
"FROM   sfe_view.vw_f4211_repl_previa vwreplprev0_ " +
"WHERE  vwreplprev0_.sddmct = '9912231583' " +
"GROUP  BY vwreplprev0_.sdan8, " +
      "vwreplprev0_.sdcnid, " +
      "vwreplprev0_.sdlitm, " +
      "vwreplprev0_.sduorg, " +
      "vwreplprev0_.sdaexp " +
"ORDER  BY vwreplprev0_.sdan8 ASC  ";
    Collection<PreviaFaturaBean> result =    getEntityManager().createNativeQuery(sql).getResultList();
    paginador.setColecaoDeRegistros(result);

我不知道问题是什么。我通过Criteria Query实现的唯一参考是http://docs.oracle.com/javaee/6/tutorial/doc/gjivm.html,有人可以给我一个提示吗?

1 个答案:

答案 0 :(得分:0)

以下部分看起来不对,并且与本机查询不匹配:

query.where(criteriaBuilder.equal(root.get(VwReplPrevia_.numeroContrato), contrato));
if (StringUtils.isNotBlank(centroCustos)) {
    criteriaBuilder.and(criteriaBuilder.equal(root.get(VwReplPrevia_.codigoCentroCustos), "9912231583"));
}

应该是

query.where(criteriaBuilder.equal(root.get(VwReplPrevia_.numeroContrato), "9912231583"));
if (StringUtils.isNotBlank(centroCustos)) {
    criteriaBuilder.and(criteriaBuilder.equal(root.get(VwReplPrevia_.codigoCentroCustos), centroCustos));
}

如果这不是问题,请查看JPA引擎在日志中生成哪个SQL查询,并将其与本机查询进行比较,以找出差异。