2016-07-15 48 views
0

我正在应用程序中使用的Java 1.6,JSF 2.0,JPA 2.0,Primefaces超过5.3在WebLogic Server 10.3.6过滤CriteriaQuery中JPA 2.0

我需要实现特定模块的懒惰数据表的负担,我不能使过滤器工作。

这是加载方法:

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精细]:2016年7月15日11:15:35.415 - 的ServerSession (1294563329) - 连接(1645363733) - 线程(线程[[ACTIVE] ExecuteThread:'21'for队列:'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从上面的SE_OPCIONES (?)LIKE?)a WHERE ROWNUM < =?)WHERE rnum>? bind => [NOMBRE,%ROL%,10,0]

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

+0

几件事情更换

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

:我没有看到一个错误,而且从一个普通的Java类的查询工作与主(或单位测试) – Kukeltje

回答

0

我已经固定,通过

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

什么是**错误**? – Kukeltje