编程语言
首页 > 编程语言> > java-创建使用JPA2和CriteriaBuilder的通用方法

java-创建使用JPA2和CriteriaBuilder的通用方法

作者:互联网

我正在开发一个使用JSF2和JPA2框架的Web应用程序.
我开始使用netbeans7.0上的向导,“从实体类创建新的JSF页面”创建了classAbstractFacade”,其中包含以下有用的方法:

public List<T> findRange(int[] range) {
  javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
  cq.select(cq.from(entityClass));
  javax.persistence.Query q = getEntityManager().createQuery(cq);
  q.setMaxResults(range[1] - range[0]);
  q.setFirstResult(range[0]);
  return q.getResultList();
}

其中T是包含表的数据库结构的实体类,而range变量包含两个数字,用于检索结果的子列表!
现在,我对其进行修改以设置order by子句,并检查用户是否在范围内,新代码为:

    public List<T> findRangeOrdered(int[] range, String orderBy) {
      javax.persistence.criteria.CriteriaQuery<T> cq = (javax.persistence.criteria.CriteriaQuery<T>)getEntityManager().getCriteriaBuilder().createQuery();
      cq.select(cq.from(entityClass));
      javax.persistence.criteria.Root<T> r = cq.from(entityClass);
      if(orderBy!=null && !orderBy.equals("")){
        if(orderBy.ebdsWith(" desc"))
          cq.orderBy(getEntityManager().getCriteriaBuilder().desc(r.get(orderBy.substring(0,orderBy.indexOf(" ")))));
        else
          cq.orderBy(getEntityManager().getCriteriaBuilder().desc(r.get(orderBy.substring(0,orderBy.indexOf(" ")))));
      }
      javax.persistence.Query q = getEntityManager().createQuery(cq);
      if(range!=null)
      {
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
      }
      return q.getResultList();
    }

现在,我将添加一些where选项.
我正在考虑添加一个List变量,该变量可能包含带有这两个键的HashMap.值:

>“类型”->我要搜索的字段的类型(例如String.class或java.util.Date.class);
>“名称”->实体类上字段的名称;
>“ value0”->我要寻找的第一个值;
>“ value1”-> “ between”子句的第二个值;
>“条款”->我要使用哪个过滤器.

现在我有些怀疑:

1)这是一个好主意吗?

2)是否已经实现此功能的框架退出?

3)如果前面的问题的答案是:是的,这是一个好主意;不,还没有任何框架可以实现,我发现了以下新问题:
这个新方法返回了一些编译器错误:

public List<T> findAllFiltered(int[] range, String orderBy, List<HashMap<String,Object>> whereList) {
  List<Predicate> predicateList = new ArrayList<Predicate>();
  String buf;
  HashMap<String,Object> where;
  int i=0;
  javax.persistence.criteria.CriteriaQuery<T> cq = (javax.persistence.criteria.CriteriaQuery<T>)getEntityManager().getCriteriaBuilder().createQuery();
  cq.select(cq.from(entityClass));
  javax.persistence.criteria.Root<T> r = cq.from(entityClass);
  javax.persistence.criteria.Path<T> path = cq.from(entityClass);
  if(whereList!= null && whereList.size()>0){
    Iterator iter=whereList.iterator();
    Predicate p;
    while (iter.hasNext())    
    {
      where=(HashMap<String,Object>)iter.next();

      if(where.get("where").toString().equals("like"))
        p = getEntityManager().getCriteriaBuilder().like(getEntityManager().getCriteriaBuilder().upper(r.<String>get(where.get("name").toString())), "%"+where.get("value0").toString().toUpperCase()+"%");
      else if(where.get("where").toString().equals("equal"))
        p = getEntityManager().getCriteriaBuilder().equal(r.get(where.get("name").toString()), where.get("value0").toString());
      else if(where.get("where").toString().equals("in"))
        p = getEntityManager().getCriteriaBuilder().and(r.get(where.get("name").toString()).in(where.get("value0").toString().replaceAll("#",",")));
      else if(where.get("where").toString().equals("between"))
      {
        java.util.Date value0=(java.util.Date)where.get("value0");
        java.util.Date value1=(java.util.Date)where.get("value1");
        p = getEntityManager().getCriteriaBuilder().between(r.<java.util.Date>get(where.get("name").toString()),value0,value1);
      }
      else if(where.get("where").toString().equals("greatest"))
        p = getEntityManager().getCriteriaBuilder().and(getEntityManager().getCriteriaBuilder().greatest(r.<Long>get(where.get("name").toString())));
      else if(where.get("where").toString().equals("greaterThanOrEqualTo"))
      {
        java.util.Date value0=(java.util.Date)where.get("value0");
        p = getEntityManager().getCriteriaBuilder().greaterThanOrEqualTo(r.<java.util.Date>get(where.get("name").toString()),value0);
      }
      else if(where.get("where").toString().equals("lessThanOrEqualTo"))
      {
        java.util.Date value0=(java.util.Date)where.get("value0");
        p = getEntityManager().getCriteriaBuilder().lessThanOrEqualTo(r.<java.util.Date>get(where.get("name").toString()),value0);
      }

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

  if(orderBy!= null&& !orderBy.equals("")){
    if(orderBy.endsWith("desc"))
      cq.orderBy(getEntityManager().getCriteriaBuilder().desc(r.get(orderBy.substring(0,orderBy.indexOf(" ")))));
    else
      cq.orderBy(getEntityManager().getCriteriaBuilder().asc(r.get(orderBy.substring(0,orderBy.indexOf(" ")))));
  }

  javax.persistence.Query q = getEntityManager().createQuery(cq);
  if(range!=null){
    q.setMaxResults(range[1] - range[0]);
    q.setFirstResult(range[0]);
  }
  return q.getResultList();
}

1)“ greestst”方法返回此错误:

p = getEntityManager().getCriteriaBuilder().and(getEntityManager().getCriteriaBuilder().greatest(r.<Long>get(where.get("name").toString())));
method CriteriaBuilder.and(Expression<Boolean>,Expression<Boolean>) is not applicable
(actual and formal argument lists differ in length)
method CriteriaBuilder.and(Predicate...) is not applicable
(argument type Expression<Long> does not conform to vararg element type Predicate)

我搜索了有关此方法的示例,但没有发现任何有用的东西.

2)正如我写的那样,我的HashMapp也包含我想要过滤的字段类,现在我将使用此信息来重写之间的greatThanOrEqualTo,lessThanOrEqualTo,因此,如果可以的话,我可以过滤除java.util之外的其他类型.日期!
您如何看待这个长期问题?
谢谢您的帮助!

附注:对不起,我的英语不好,但我是意大利语.

P.S.2:也很抱歉,我的代码结构…我是盲目的,我并没有一直控制缩进…这个站点控制了它,但是我不确定我是否正确缩进了所有代码!

解决方法:

恕我直言,这不是一个好主意.您正在重新发明一种新的通用查询语言,而该新查询语言将是

>表现不如JPQL
>非标
>比Criteria API的类型安全性差
>比JPQL和条件效率低

因此,您的问题的答案是

>不,这不是一个好主意
>是的,这样的框架已经存在.称为JPQL.

标签:jpa-2-0,java
来源: https://codeday.me/bug/20191202/2085364.html