【问题标题】:Filter CriteriaQuery JPA 2.0过滤条件查询 JPA 2.0
【发布时间】:2016-07-15 18:44:57
【问题描述】:

我正在 WebLogic 服务器 10.3.6 上使用 Java 1.6、Jsf 2.0、JPA 2.0、Primefaces 5.3 制作应用程序

我需要为某些模块实现惰性数据表负担,但我无法使过滤器工作。

这是加载方法:

public List<T> load(int first, int pageSize, String sortField,
    SortOrder sortOrder, Map<String, Object> filters) {
// TODO Auto-generated method stub
try {
    List<T> list = new ArrayList<T>();

    //Criteria Query
    CriteriaBuilder cb = this.ejbUtils.getEntityManagerPrivate().getCriteriaBuilder();
    CriteriaQuery<T> cq = cb.createQuery(entityClass);

    //From
    Root<T> from = cq.from(entityClass);

    //Sort
    if(sortField != null){
        if(sortOrder == SortOrder.ASCENDING){
            cq.orderBy(cb.asc(from.get(sortField)));
        }else{
            cq.orderBy(cb.desc(from.get(sortField)));
        }
    }

    //Filters
    if(!filters.isEmpty()){

        List<Predicate> predicates = new ArrayList<Predicate>();

        for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {

            String filterProperty = it.next();
            Object filterValue = filters.get(filterProperty);                   
            Expression<String> literal = cb.upper(cb.literal((String)filterProperty.toUpperCase()));

            predicates.add(cb.like(literal, String.valueOf("%" + filterValue + "%").toUpperCase()));

        }               
        cq.where(predicates.toArray(new Predicate[predicates.size()]));             
    }   

    Query q = this.ejbUtils.getEntityManagerPrivate().createQuery(cq);

    list = q
            .setFirstResult(first)
            .setMaxResults(pageSize)
            .getResultList();

    this.setRowCount(this.ejbUtils.count());

    return list;
  } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    return null;
  }
}

然后我查看了 EclipseLink 日志并把这个扔给我

[EL Fine]: 2016-07-15 11:15:35.415--ServerSession(1294563329)--Connection(1645363733)--Thread(Thread[[ACTIVE] ExecuteThread: '21' for queue: 'weblogic. kernel.Default (self-tuning)',5,Pooled Threads])--SELECT * FROM (SELECT /*+ FIRST_ROWS / a., ROWNUM rnum FROM (SELECT ID AS a1, ACTION AS a2, ACTIVA AS a3, FECHA_CREACION AS a4, FECHA_MODIFICACION AS a5, NOMBRE AS a6, USUARIO_CREACION AS a7, USUARIO_MODIFICACION AS a8, ID_PADRE AS a9 FROM SE_OPCIONES WHERE UPPER(?) LIKE ?) WHERE ROWNUM ?绑定 => [NOMBRE, %ROL%, 10, 0]

然后,当我在数据表中输入过滤器时,永远不会带来结果。

【问题讨论】:

  • 几件事:我没有看到错误,并且查询是否从带有主(或单元测试)的普通 java 类中工作

标签: jpa


【解决方案1】:

我已经修好了,替换

predicates.add(cb.like(literal, String.valueOf("%" + filterValue + "%").toUpperCase()));

通过

predicates.add(cb.like(cb.upper(from.get(filterProperty).as(String.class)), String.valueOf("%" + filterValue + "%").toUpperCase()));

【讨论】:

    猜你喜欢
    • 2015-05-26
    • 2019-09-29
    • 1970-01-01
    • 2011-11-16
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多