使用Hibernate的JPA 2.0标准查询

JPA 2.0中引入了条件查询 。 借助条件查询,您可以以类型安全的方式编写查询。 在进行标准查询之前,开发人员必须通过构建基于对象的查询定义来编写查询。 构建查询时,可能会出现语法错误的情况。 条件查询API提供了创建具有编译时安全性的结构化和嵌套查询的功能。 进入有关标准查询的更多理论可能不是一个好主意,因为可以在网上找到大量相同的页面。 让我们举一个简单的例子来了解使用条件查询的查询。 在这篇文章中,我将Hibernate作为JPA 2.0的供应商来展示Criteria Query的示例。
在深入探讨标准查询之前,让我们考虑一下可以表示为实体的数据库表和相应的Java类:

数据库表:

例如,下面有两个数据库表:

    1. 状态[stateId,stateName]
    2. 城市[cityId,stateId(FK#),CityName]
我们要获取特定州的城市列表,在该州中,城市名称应从“ M”开始,城市列表应按升序排列。 如果我们考虑简单的本机SQL,则如下所示:
Select * from City c, State s where c.stateId = s.stateId and c.stateId = ? and c.cityName like "M%" order by c.cityName

JPA实体:

以下是配置为JPA实体以表示州和城市表的两个Java类。 这些也可以使用逆向工程工具生成。

STATE表的Java实体

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.util.Date;
import java.util.Set;
import javax.persistence.SequenceGenerator;@Entity
@Table(name="STATE")
@SequenceGenerator(sequenceName="STATE_SEQ",name="STATE_SEQ_GEN")
public class State {private Long stateId;private String stateName;private Set citySet;@Id@Column(name="stateId")@GeneratedValue(generator="STATE_SEQ_GEN",strategy=GenerationType.SEQUENCE)public Long getStateId;() {return stateId;}public void setId(long stateId) {stateId = stateId;}@Column(name="stateName")public String getStateName() {return stateName;}public void setStateName(String stateName) {this.stateName = stateName;}public void setCitySet(Set citySet)this.citySet= citySet;}@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="state")public Set getCitySet() {return citySet;}
}

CITY表的Java实体

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;@Entity
@Table(name="CITY")
@SequenceGenerator(sequenceName="CITY_SEQ",name="CITY_SEQ_GEN")
public class City {private Long cityId;private String cityName;private State state;public void setId(long cityId) {this.cityId = cityId;}@Id@Column(name="CityId")@GeneratedValue(generator="CITY_SEQ_GEN",strategy=GenerationType.SEQUENCE)public Long getCityId() {return cityId;}@Column(name="CityName")public void setContent(String cityName) {this.cityName = cityName;}public String getCityName() {return cityName;}public void setState(State state) {this.state = state;}@ManyToOne(fetch =  FetchType.LAZY)@JoinColumn(name = "STATEID", nullable = false)public state getState() {return state;}
}

值对象(PO​​JO):

以下是两个值对象。 借助条件查询,您可以直接从结果数据映射值对象。 您无需编写代码即可将结果数据从实体类复制到value对象。 这确实是条件查询中令人兴奋的功能。
public class StateVO {private Long stateId;private String stateName;private Set cityVOSet;// All getter setters}
public class CityVO {private Long cityId;private String cityName;private StateVO stateVO;public CityVO( Long cityId, String cityName){this.cityId=cicityId;this.cityName=cityName;}// All getter setters
}

DAO实施:

现在是时候使用标准查询来获取数据了。 我们将公开一个将输入参数作为StateVO并返回CityVO列表的方法。
import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;public class StateCityDAOImpl{public List getCityList(StateVO searchStateVO)  {// Get the entity manager instanceEntityManagerFactory emf = Persistence.createEntityManagerFactory("StateCityService");EntityManager entityManager= emf.createEntityManager();// Get the criteria builder instance from entity managerfinal CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();// Create criteria query and pass the value object which needs to be populated as resultfinal CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(CityVO.class);// Tell to criteria query which tables/entities you want to fetch// To join the City and State tables, we need to write below codefinal Root stateRoot = criteriaQuery.from(State.class);final Root cityRoot = criteriaQuery.from(City.class);// Time to define where clause in terms of Predicates// This list will contain all Predicates (where clauses)List criteriaList = new ArrayList();// Note: Ensure that whatever string you are passing in root variables// It should be matched with variables' name in entity classes// [1] where condition: State.StateId = City.StateIdPredicate predicate1 = criteriaBuilder.equal(cityRoot. get("state"). get("stateId"),stateRoot.  get("stateId"));criteriaList.add(predicate1);// [2] where condition: City.StateId = ?if (searchStateVO.getStateId() != null) {Predicate predicate2= criteriaBuilder.equal(cityRoot. get("state"). get("stateId"),searchStateVO.getStateId());criteriaList.add(predicate2);}// [3] where condition: City.cityName like 'M%'Predicate predicate3= criteriaBuilder.like(criteriaBuilder.upper(cityRoot. get("cityName")),"M%");criteriaList.add(predicate3);  // This statement maps your CityVO with result data// You have to have a custom constructor in CityVO  (see above) to populate the result data   criteriaQuery.select(criteriaBuilder.construct(CityVO.class, cityRoot. get("cityId"),cityRoot. get("cityName")));// Pass the criteria list to the where method of criteria querycriteriaQuery.where(criteriaBuilder.and(criteriaList.toArray(new Predicate[0])));// Order by clause based on city namescriteriaQuery.orderBy(criteriaBuilder.asc(cityRoot. get("cityName")));// Here entity manager will create actual SQL query out of criteria queryfinal TypedQuery query = entityManager.createQuery(criteriaQuery);// This code can be used to define the row range to fetch the result/* if (CitySize != 0) {query.setFirstResult(startIndex); // starting row indexquery.setMaxResults(endIndex); //  end row index}*/return query.getResultList();}
现在我们有了CityVO清单作为您的答案。 我们可以根据上述要求访问相应的城市名称。
虽然,使用条件查询编写查询可能有点笨拙,但是一旦使用方便,您就会喜欢“条件查询”。

参考:我们的JCG合作伙伴 Narendra Verma在NS.Infra博客上的《 使用Hibernate进行JPA 2.0标准查询》 。

翻译自: https://www.javacodegeeks.com/2013/04/jpa-2-0-criteria-query-with-hibernate.html

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

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

相关文章

response对象的使用

使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面。重定向操作支持将地址重定向到不同的主机上,这一点与转发是不同的。在客户端浏览器上将会得到跳转地址,并重新发送请求链接。用户可以从浏览器的地址栏中看到跳转后的地址。进行…

java 菜单 分隔符_在Java中使用分隔符连接值列表最优雅的方法是什么?

我从来没有找到一个整洁(呃)的方式来做以下事情.说我有一个列表/数组的字符串.abcdefghijkl我想将它们连接成一个由逗号分隔的单个字符串,如下所示:abc,def,ghi,jkl在Java中,如果我这样写(原谅语法),String[] list new String[] {"abc","def",…

thinkphp3.2----实现伪静态和路由配置

URL模式: 0.普通 http://localhost/qixin/ThinkCMF(test)_backup/index.php?guser&mlogin&aindex    带有?号这种传参路径,对SEO不友好 1.pathinfo http://localhost/qixin/ThinkCMF(test)_backup/index.php/user/login/ind…

Cmder - 在右键菜单添加Cmder Here

使用命令行或终端工具的时候都有一个让我们觉得麻烦的问题,就是需要cd很多目录达到目标位置。在可视化操作系统下面我们一般都是已经处在目标目录了,这时需要执行某些命令如: python test.py   现在只需要右键点击"Cmder Here"即…

标题:a 和 a的区别

以前我也是老搞不懂a 和 a的区别, 后来看了很多资料, 终于总结出来一条规律, 小白专用! 看完这个例子就懂了: 例1:$a 8, 求 a a - --a a-- a得多少? 旧值: 8 9 10 9 8 a a - --a a-- a 新值: 9 …

Java EE CDI处理程序方法示例

这是CDI Disposer方法的教程。 在CDI中,由于Producer方法生成的对象随后可以注入到应用程序中,因此使用Disposer方法,以便在其工作完成时将其删除。 Disposer方法始终与Producer方法匹配。 Disposer方法的使用示例是应用程序使用与数据库的连…

转 如何更改linux文件的拥有者及用户组(chown和chgrp)

本文整理自: http://blog.163.com/yanenshun126/blog/static/128388169201203011157308/http://ydlmlh.iteye.com/blog/1435157一、基本知识在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户。该文件用户可以修改该文件的拥有者…

微信小程序开发工具最新版本已更新下载(1.02.1804120)

下载地址:windows 64 、 windows 32 、 mac本次更新修复信息如下:1、修复 1.02.1804080 引入的编译条件为分包内页面时无法加载的问题 1. 更新到最新版本后 ,编译模式中创建新的直接编译分包(/subpage/a)入口的页面,页面显示白屏无…

Gradle的好处:运行单个测试

我们可以使用Java插件添加的test任务,使用Gradle运行测试代码。 默认情况下,将执行项目中找到的所有测试。 如果要运行单个测试,则可以使用Java系统属性test.single和测试名称。 实际上,系统属性的模式是taskName .single 。 task…

上下div高度动态自适应--另类处理方案

这段时间在工作中遇到一个看似较为棘手的问题。问题描述:查询报表页面分为上下两部分,上部分为条件输入区域,下部分为报表展示区域。客户要求做到默认满屏(但要动态适应不同的窗体大小,也就是浏览器窗体用户会手动改变…

java缓冲输入流_java _io_字符缓冲流的输入、输出

新增方法:输入:BufferedReader breadernew BufferedReader(Reader reader);.readLine()读取一行内容,返回字符串输出:BufferedWriter bwriternew BufferedWirter(Writer writer);.newLine() 写入一个换行符输入:File f new File("C:\Users\10853\eclipse-works…

Android Activity has leaked window that was originally added

今天调试程序时log中突然打印这样的错误,但是程序并没有crash,为了不放过一个错误,我决定调查一下。 当时是离开一个activity,然后提示是否退出此界面,接下来就打印此错误: 03-08 18:02:48.521: E/WindowMa…

201571030316/201571030314 《小学四则运算练习软件需求说明》结对项目报告

小伙伴儿的博客地址链接:http://www.cnblogs.com/mjuan/p/8877738.html 我的学号:201571030316 小伴儿的学号:201571030314 一、调研过程: 1. 调查问卷:https://www.wjx.cn/jq/22680271.aspx利用问卷…

关于Java 8的Optional的介绍

我最近发现了JDK 8中Optional类型的添加。 Optional类型是避免NullPointerException一种方法,因为从方法中获取Optional返回值的API使用者被“强制”执行“在线”检查,以消耗其实际返回值。 更多细节可以在Javadoc中看到。 可以在此博客文章中找到非常有…

如何加快HTML页面加载速度

1. 页面减肥 a. 页面的肥瘦是影响加载速度最重要的因素。 b. 删除不必要的空格、注释。 c. 将inline的script和css移到外部文件。 d. 可以使用HTML Tidy来给HTML减肥,还可以使用一些压缩工具来给JavaScript减肥。 2. 减少文件数量 a. 减少页面上引用的文件数…

java 英文字符串排序_英文字符串排序算法

编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下问题 - 英文字符串排序如下几个英文单词或者字母apple&#…

23种设计模式之一(单例模式)

单例模式:(确保一个类最多只有一个实例,并提供一个全局访问点) 存在的意义: 有些对象我们只需要一个,如:线程池、缓存、硬件设备等;如果使用多个实例就会造成冲突、不一致等&#xf…

mysql监控

1、查看mysql所有线程:show full processlist;SHOW PROCESSLIST显示哪些线程正在运行。如果您有SUPER权限,即root权限之类,您可以看到所有线程。否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账…

vSphere ESXi主机配置iSCSI存储

vSphere ESXi主机配置iSCSI存储 vSphere ESXi主机一般连接的存储类型有光纤存储、iSCSI存储两类。本次案例为iSCSI存储连接ESXi主机的配置。 案例环境:ESXi主机通过以太网络来连接iSCSID存储,并获取到存储空间,拓扑如下: 首先完成…

Java EE 7:带有Glassfish v4的JMS 2.0

Java EE 7最近已被执行委员会接受 。 这意味着我们很快将在市场上提供Java EE 7应用服务器。 构成Java EE 7的规范之一是JMS 2.0 。 自1.1版以来,引入了一些有趣的改进。 JMS有很多怪异的东西,例如: Connection#createSession&am…