jpa 与非jpa 结合_EasyCriteria –使用JPA标准的简便方法

jpa 与非jpa 结合

今天,我们将看到有关此工具的信息,该工具使使用JPA Criteria更加容易。 使用该库的应用程序将在JPA实现中更加简洁,易于使用和可移植。

在本文的结尾,您将找到要下载的源代码。

什么是标准? 当前是创建动态查询的最佳解决方案。 想象一个页面,该页面允许用户执行几种类型的查询; 所请求的查询可以是按名称,按年龄或二者兼有。 让我们看一下如果连接一个字符串查询的外观:

EntityManager em = emf.createEntityManager();
String hql = "select p from Person p where 1=1 ";if(parameters[0].equals("name")){hql += " and p.name = '" + values[0] + "'";
}if(parameters[1].equals("age")){hql += " and p.age = " + values[1];
}TypedQuery<Person> query = em.createQuery(hql, Person.class);System.out.println(query.getResultList());

注意,在上面的代码中进行了字符串连接; 请记住,这种做法是一种不良和危险的做法,因为它允许“ SQL Injection”黑客攻击。 为了避免这种攻击,我们应该使用带有参数的查询:

EntityManager em = emf.createEntityManager();
String hql = "select p from Person p where 1=1 ";if(parameters.contains("name")){hql += " and p.name = :name";
}if(parameters.contains("age")){hql += " and p.age = :age";
}TypedQuery<Person> query = em.createQuery(hql, Person.class);if(parameters.contains("name")){query.setParameter("name", values[0].toString());
}if(parameters.contains("age")){query.setParameter("age", Integer.valueOf(values[1].toString()));
}System.out.println(query.getResultList());

注意,SQL注入问题已解决,但是现在代码必须检查参数以将其添加到查询中,并在以后传递其值。 代码需要两个“参数搜索”来完成任务。

Java / Oracle开发人员在创建适用于这种情况的Criteria概念时就有了一个绝妙的主意。 在下面,使用本地JPA标准检查代码的外观:

EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
cq.select(root);if(parameters.contains("name")){Path<String> name = root.get("name");cq.where(cb.and(cb.equal(name, values[0])));
}if(parameters.contains("age")){Path<Integer> name = root.get("age");cq.where(cb.and(cb.equal(name, Integer.valueOf(values[1].toString()))));
}TypedQuery<Person> query = em.createQuery(cq);System.out.println(query.getResultList());

可能看到传递参数值比较容易。 不需要连接字符串或检查参数列表值来填充值。

不幸的是,Criteria API过于复杂和冗长。 如果您只想“从人物p中选择p”,则需要创建以下条件:

EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
cq.select(root);TypedQuery<Person> query = em.createQuery(cq);
System.out.println(query.getResultList());

对许多代码来说,如此简单就可以从表中列出所有人。

为了避免所有这些冗长的细节,创建了名为EasyCriteria的开源项目。 如果开发人员使用EasyCriteria,则上面的查询如下所示:

EntityManager em = emf.createEntityManager();
EasyCriteria<Person> easyCriteria = EasyCriteriaFactory.createQueryCriteria(em, Person.class);if(parameters.contains("name")){easyCriteria.whereEquals("name", values[0]);
}if(parameters.contains("age")){easyCriteria.whereEquals("age", values[1]);
}System.out.println(easyCriteria.getResultList());

请注意,所有JPA详细信息都已消失。 现在可以使用干净的代码,更轻松地创建动态查询。 关于上面的代码值得一谈:

  • 第2行:通过“工厂”创建EasyCriteria的实例。 该工厂的存在是为了对创建EasyCriteriaImp类型的对象所需的所有陡峭对象进行抽象。 在将来的版本中,将添加新类型的EasyCriteria,例如“ Tuple”。
  • 第5和9行:传递参数更容易。 要将参数传递给比较值(“ name =:name”),只需使用equals方法,该方法将属性名称作为第一个参数。 第二个参数将是等于的值。
  • 第12行:要运行查询,就不必使用Query界面。 EasyCriteria本身承担此责任。 可以通过EasyCriteria提取查询结果。 有两种方法可用于获取查询结果:EasyCriteria.getSingleResult(),EasyCriteria.getResultList()。

在EasyCriteria网页上,可以找到几个代码示例以及可以使用的方法。 EasyCriteria的另一个优点是可以“链接”所有方法:

easyCriteria.whereEquals("name", values[0]).whereEquals("age", values[1]).getResultList();

这是一个轻量级的库,因为唯一的依赖关系是系统将需要的JPA。 注意:您的应用程序将需要启动并运行JPA实现。

该库是使用JUnit开发的,并已通过Hibernate,OpenJPA和EclipseLink进行了测试。 JUnit还使用Cobertura框架来检查测试是否覆盖了所有代码行(或其中大部分),到目前为止,我们已覆盖了100%。

EasyCriteria仍处于Beta版,但开发团队已计划好一些版本和功能。

EasyCriteria的另一个优点是您的软件代码不再“耦合”到任何类型的JPA实现中。 如今,Hibernate具有良好的条件工具,但是您的代码必须保持“附加”。 使用EasyCriteria,您将能够使用任何一种JPA实现。 这个解耦库的证明是EasyCriteria已通过前面引用的3种实现进行了测试。

EasyCriteria具有以下方法:in,like,empty和其他。 开发人员将能够使用Criteria进行连接(只是没有参数的简单连接),所有人都可以区分甚至排序。

在这里,您将找到EasyCriteria,可以下载并访问其所有文档。

单击此处下载此帖子的源代码。

我希望这篇文章/工具可以对您有所帮助。

参考: EasyCriteria –通过 uaiHebert博客的JCG合作伙伴 Hebert Coelho 使用JPA Criteria的简便方法 。


翻译自: https://www.javacodegeeks.com/2012/07/easycriteria-easy-way-to-use-jpa.html

jpa 与非jpa 结合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在c++中qsort()排序函数的使用qsort函数应用大全

七种qsort排序方法 <本文中排序都是采用的从小到大排序> 一、对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二、对char类型数组排序&#xff08;同in…

Python排序算法之快速排序

转自&#xff1a;https://www.cnblogs.com/AlwinXu/p/5424905.html 快速排序&#xff08;quickSort&#xff09; 快排的思想&#xff1a;首先任意选取一个数据&#xff08;通常选用数组的第一个数&#xff09;作为关键数据&#xff0c;然后将所有比它小的数都放到它前面&#x…

Apache PDFBox 2

Apache PDFBox 2已于今年早些时候发布 &#xff0c; Apache PDFBox 2.0.1和Apache PDFBox 2.0.2已发布。 Apache PDFBox是开源的&#xff08; Apache许可证版本2 &#xff09;并且基于Java&#xff08;因此易于使用&#xff0c;包括Java &#xff0c; Groovy &#xff0c; Scal…

HDU题目分类啊!!!

分类一&#xff08;详细&#xff09;&#xff1a; 分类二&#xff1a; 基础题&#xff1a;1000、1001、1004、1005、1008、1012、1013、1014、1017、1019、1021、1028、1029、1032、1037、1040、1048、1056、1058、1061、1070、1076、1089、1090、1091、1092、1093、1094、1095…

关于DP与背包

听说过动态规划&#xff08;DP&#xff09;的同学应该都知道有背包问题的存在。 首先我们来了解一下动态规划 基本思想&#xff1a; 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中&#xff0c; 可能会有很多可行解。没一个解都对应于一个值&#xff0c;我们希…

MATLAB图像中添加标记

指定坐标添加标记: text(x,y,str)手动指定位置添加标记: gtext(str)横纵坐标xlabel()%横ylabel()%纵tittle()%标题

QQ空间说说的表情添加的代码

QQ空间说说的表情添加的代码 [em]e100[/em] 微笑 [em]e101[/em] 撇嘴[em]e102[/em] 色[em]e103[/em] 发呆[em]e104[/em] 得意[em]e105[/em] 流泪[em]e106[/em] 害羞[em]e107[/em] 闭嘴[em]e108[/em] 睡[em]e109[/em] 大哭[em]e110[/em] 尴尬[em]e111[/…

使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第3部分

在之前的博客中&#xff0c;我们使用Thymeleaf&#xff0c;Bower和Bootstrap构建了登录页面&#xff0c;并将其部署到了Heroku。 在此博客中&#xff0c;我们将介绍用于前端的AngularJS和在后端的Spring Boot Web服务的一些功能。 我们将从“登录/注销”部分开始。 让我们开始…

Nginx配置安装

安装之前准备1、依赖 gcc openssl-devel pcre-devel zlib-devel 安装&#xff1a;yum install gcc openssl-devel pcre-devel zlib-devel -y 安装Nginx./configure make && make install 默认安装目录&#xff1a;/usr/local/nginx 配置Nginx为系统服务&#xff0c;以…

matlab自定义窗口名

fg1figure(numbertitle,off,name,标题名称,color,white);saveas(fg1,保存图形的名称);clruprop 清除用户自定义属性setuprop 设置用户自定义属性getuprop 获取用户自定义属性

【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构

系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇&#xff1a;利用SqlSugar快速实现CRUD 3.3 生成实体类 四. 集成JWT授权验证 本来打算将搭建项目架构和集成SqlSugar放在一起讲的&…

zk 布局_ZK实际应用:样式和布局

zk 布局在先前的ZK in Action帖子中&#xff0c;我们使用ZK MVVM实现了CRUD功能 。 我们还快速浏览了一些样式代码&#xff0c;可能需要更多的解释。 在本文中&#xff0c;我们将介绍如何在ZK小部件上附加新CSS样式规则&#xff0c;以及如何覆盖现有样式。 我们还将介绍ZK中UI布…

蓝桥杯 2011年第二届C语言初赛试题(2)

6. 代码填空 &#xff08;满分9分&#xff09; 中奖计算 某抽奖活动的规则是&#xff1a;每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同&#xff0c;则称为中了几个号。 例如&…

MATLAB离散一维小波函数

waveinfowfilters(wname);appcoef近似系数 detcoef详细系数dwt 单层独立1-D小波idwtupcoef 线性重建upwlev 单层重建wavedec wavelet decompositionwaverecwrcoef

使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分

在这一系列博客文章中&#xff0c;我们将使用以下技术堆栈构建完整的响应式Web应用程序&#xff1a; 1&#xff09;弹簧靴 – Spring MVC网站 – Spring Data JPA –Spring安全 2&#xff09;Thymeleaf用于服务器端模板 3&#xff09;客户端MVC的Angular JS&#xff08;包括…

Codeforces 999F Cards and Joy 【dp】【性质】

读完这道题后应该想到牌有多少张都是什么不重要&#xff0c;重要的是player的favorite number是怎么分配的。&#xff08;因为不是任何player的favorite number不能带来任何joy&#xff09;然后每个favorite number带来的joy互相不受影响&#xff0c;因为如果favorite number不…

蓝桥杯 2011年第二届C语言初赛试题(3)

1、假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次&#xff08;数目加倍&#xff09;&#xff0c;Y出生后每隔2分钟分裂一次&#xff08;数目加倍&#xff09;。 一个新出生的X&#xff0c;半分钟之后吃掉1个Y&#xff0c;并且&#xff0c;从此开始&#xff0c…

MATLAB凸包Convex hull运算

凸包Convex hull运算&#xff08;求离散点的边界&#xff09; [k,a] convhull(x,y); K convulln(X, options);[K AV] convexHull(DT);tsearch :搜索Delaunay三角形delaunay :Delaunay三角化dsearch :求最近点 (这是两个有趣的函数)inpolygon :搜索多边形…

MATLAB Floyd算法

Floyd算法 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。 核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] nn开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(…