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

我正在开发一个使用JSF2和JPA2框架的Web应用程序.

我开始使用netbeans7.0上的向导,“从实体类创建新的JSF页面”创建了classAbstractFacade”,其中包含以下有用的方法:

public List 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 findRangeOrdered(int[] range, String orderBy) {

javax.persistence.criteria.CriteriaQuery cq = (javax.persistence.criteria.CriteriaQuery)getEntityManager().getCriteriaBuilder().createQuery();

cq.select(cq.from(entityClass));

javax.persistence.criteria.Root 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 findAllFiltered(int[] range, String orderBy, List> whereList) {

List predicateList = new ArrayList();

String buf;

HashMap where;

int i=0;

javax.persistence.criteria.CriteriaQuery cq = (javax.persistence.criteria.CriteriaQuery)getEntityManager().getCriteriaBuilder().createQuery();

cq.select(cq.from(entityClass));

javax.persistence.criteria.Root r = cq.from(entityClass);

javax.persistence.criteria.Path path = cq.from(entityClass);

if(whereList!= null && whereList.size()>0){

Iterator iter=whereList.iterator();

Predicate p;

while (iter.hasNext())

{

where=(HashMap)iter.next();

if(where.get("where").toString().equals("like"))

p = getEntityManager().getCriteriaBuilder().like(getEntityManager().getCriteriaBuilder().upper(r.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.get(where.get("name").toString()),value0,value1);

}

else if(where.get("where").toString().equals("greatest"))

p = getEntityManager().getCriteriaBuilder().and(getEntityManager().getCriteriaBuilder().greatest(r.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.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.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.get(where.get("name").toString())));

method CriteriaBuilder.and(Expression,Expression) is not applicable

(actual and formal argument lists differ in length)

method CriteriaBuilder.and(Predicate...) is not applicable

(argument type Expression 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值