java criteria创建_java-创建使用JPA2和CriteriaBuilder的通用方法-程序员宅基地

技术标签: java criteria创建  

我正在开发一个使用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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32185607/article/details/114751642

智能推荐

substring_index(str,delim,count)_substring_index(str,delim,count) 计算count-程序员宅基地

文章浏览阅读2.2k次。substring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:计数例子:str=www.baidu.com substring_index(str,'.',1) 结果是:www substring_index(str,'.',2) 结果是..._substring_index(str,delim,count) 计算count

coldfusion_ColdFusion入门-程序员宅基地

文章浏览阅读853次。coldfusionColdFusion MX is the newest version of an already fantastic product developed by Macromedia, arguably the biggest and best producer of Web software out there. CFMX, as it’s commonly referre..._enterthefollowingcode:

Unity3D 渲染路径_unity 基于tiled base 渲染-程序员宅基地

文章浏览阅读2.8k次。Unity渲染路径: Unity支持不同的渲染路径。您应具体取决于你的游戏内容和目标平台/硬件来选择使用哪一个。不同的渲染路径有不同的特点和性能特点,主要影响灯光和阴影如果图形卡不能处理选定的渲染路径,Unity将自动使用一个较低保真度的设置。因此,在GPU上不能处理延迟照明(Deferred Lighting),将使用正向渲染(Forward Rendering )。如果不支持正向渲染(Forw_unity 基于tiled base 渲染

记不住就存下来---- HTML 5 超链接和锚点_sublime锚点-程序员宅基地

文章浏览阅读1.3k次。元素名称元素含义href指定超链接所关联的另一个资源 target 指定使用框架集中的哪个框架来装在另一个资源,该属性值可以是_self (使用自身), _blank (使用新窗口), _top (使用顶层框架) , _parent (使用父框架) 四个值来装载新资源. mediaHTML 5 新增属性, _sublime锚点

Arduino小白的学习记录:RGB-LED传感器实验_regled传感器实验-程序员宅基地

文章浏览阅读3.1k次。在上一个实验中我们介绍了双色LED灯的实验,但如果仅有两种颜色是不是觉得有些单调呢,接下来就让我们通过这个实验来组合出更多的颜色吧!一、介绍RGB-LED模块可以发出各种颜色的光。红色、绿色和蓝色的三个LED被封装到透明或半透明塑料外壳中,并带有四个引脚。红色、绿色和蓝色三原色(https://baike.so.com/doc/4551839-4762377.html)可以按照亮度混合并组合各种颜色,因此可以通过控制电路使RGB-LED发出彩色光。图3.1是光学中的三原色图册,大家可以先简单了解一下,后_regled传感器实验

Oracle 存储过程之遍历_oracle遍历查询结果集-程序员宅基地

文章浏览阅读3.2k次。如何使用for循环遍历拼接好的SQL语句,并执行。_oracle遍历查询结果集

随便推点

Python Rule Engine_pyknow-程序员宅基地

文章浏览阅读1.3k次。Those rule engines in python are:pyDatalog Pyke PyCLIPS durable_rules Intellect business-rules PyKnowRelative question link in stackoverflow:Python Rule Based Engine Open Source based Rules Engines in Java or Python Implementing a "rules engin_pyknow

关系型数据库的连接查询(一)_rczc-程序员宅基地

文章浏览阅读408次。业务背景:一个存放政策的表a,一个存放政策类型的表b。b表的主键lx_id,是a表的外键。rczc zc_id 政策id zcmc 政策名称 sfsc 是否删除 lx_id 类型id rczclx lx_id 类型id lxmc 类型名称 sfsc 是否删除 业务要求: 在原来只查询政策的基础上查出政策类型名称。..._rczc

回归分析中的评价方法_mean absolute difference和mean absolute error-程序员宅基地

文章浏览阅读3.6k次。回归(Regression)不同于分类问题,在回归方法中我们预测一系列连续的值,在预测完后有个问题是如何评价预测的结果好坏,关于这个问题目前学术界也没有统一的标准。下面是我在论文中的看到的一些常用方法,希望对有缘人有用。1 MAE(Mean Absolute Error)平均绝对差值In statistics, the mean absolute error (MAE) i_mean absolute difference和mean absolute error

SpringBoot自定义配置文件-程序员宅基地

文章浏览阅读1.1k次。通过启动参数加载配置文件(无需书写配置文件扩展名)properties与yml文件格式均支持也可以根据加载文件类路径来配置可以配置多个文件,如果多个文件中有重复的属性,最终生效的是最后一个文件中的属性--spring.config.location=classpath:/ebank.properties,classpath:/ebank-server.properties可以看到最终生效的是 8882 端口,是后面配置的文件当中的...

实时监听input的value值改变_监听input value变化-程序员宅基地

文章浏览阅读5.8k次。监听input的value值变化首先想到的是onchange,该事件必须由鼠标或者键盘激发$(“xxx”).on(“change”,function(){alert(“变化了”);})ie有专属的方法,onpropertychange,仅支持ie内核的浏览器,同样必须由鼠标或者键盘激发$(“xxx”).on(“propertychange”,function(){alert(“变化了..._监听input value变化

2021年政府应关注的十大技术趋势-程序员宅基地

文章浏览阅读171次。疫情迫使政府机构重新评估其数字战略并进行转型。由于资源稀缺,各国政府的优先事项发生了变化。疫情的影响加快了向远程工作模式转变的速度,同时对政府工作人员比例较大的城市产生了负面影响。这场疫情迫使政府加快实施数字化服务;但绝大部分增量部分的数字成熟度依然欠缺。Gartner基于疫情所带来的挑战明确了2021年政府技术趋势。政府首席信息官可根据这些技术趋势设计能够支持大范围变革的灵活运营和组织模型。此外,在Gartner 2019年至2020年技术趋势的基础上,我们也重点研究了这些趋势如何优化或改变公共服务。

推荐文章

热门文章

相关标签