Hibernate(七)
三套查询之HQL查询(原文再续书接上一回)
where子句部分(查询过滤部分)
Hibernate的where子句部分能支持的运算符,表达式、函数特别多,用法与sql语句是一样的.
常用的表达式、运算符、函数:
=、<、<=、>、>=、!=、and、or、distinct、between...and 、like、concat()、
is null, is not null, is empty, is not empty、second(...),
minute(...), hour(...), day(...), month(...)。
支持EJB-QL 3.0的函数:
trim(), lower(), upper(), length(), abs(), sqrt(), bit_length(), mod()
支持操作集合属性的函数:
size()|size, minelement(), maxelement(), minindex(), maxindex().
1.支持自定义的索引号
//支持自定义的索引号
@Test
public void test5(){
Query query = session.createQuery("select s from Student s where s.name like ?57");
query.setParameter("57", "%ab%");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
2.like
//like
@Test
public void test6(){
Query query = session.createQuery("select s from Student s where s.name like ?3");
query.setParameter("3", "%k%");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
3.between and
//between and
@Test
public void test7(){
Query query = session.createQuery("select s from Student s where s.name like ?3 and s.java between ?4 and ?5");
query.setParameter("3", "%k%").setParameter("4", 10).setParameter("5", 80);
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getJava()+student.getTeacher().getTname());
}
}
4.concat
//concat
@Test
public void test8(){
Query query = session.createQuery("select s from Student s where s.name like concat('%',?,'%')");
query.setParameter(0, "ab");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
5.is not null
//is not null
@Test
public void test9(){
Query query = session.createQuery("select s from Student s where s.name is not null");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
6.trim
//trim
@Test
public void test10(){
Query query = session.createQuery("select s from Student s where trim(s.name) like ?");
query.setParameter(0, "aa%");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
7.upper
//upper
@Test
public void test11(){
Query query = session.createQuery("select upper(s.name) from Student s where s.name like ?");
query.setParameter(0, "%b%");
List<String> list = query.list();
for (String string : list) {
System.out.println(string);
}
}
8.length
//length
@Test
public void test12(){
Query query = session.createQuery("select s from Student s where length(s.name)>? ");
query.setParameter(0, 4);
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
9.sqrt
//sqrt
@Test
public void test13(){
Query query = session.createQuery("select s from Student s where sqrt(s.id)=?");
query.setParameter(0, 2.0);
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
10.bit_length
//bit_length 位长度
@Test
public void test14(){
Query query = session.createQuery("select bit_length(s.name) from Student s where s.id=?57");
query.setParameter("57", 3);
Long uniqueResult = (Long) query.uniqueResult();
System.out.println(uniqueResult);
}
11.mod
//mod
@Test
public void test15(){//选取id为偶数的学生
Query query = session.createQuery("select s from Student s where mod(s.id,?)=?");
query.setParameter(0, 2);
query.setParameter(1, 0);
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
}
}
12.size
操作集合属性的函数
//size
@Test
public void test16(){
Query query = session.createQuery("select t from Teacher t where size(t.students)>?");
query.setParameter(0, 50);
List<Teacher> list = query.list();
for (Teacher teacher : list) {
System.out.println(teacher.getTid()+teacher.getTname());
}
System.out.println("======================================");
Query query1 = session.createQuery("select t from Teacher t where t.students.size>?");
query1.setParameter(0, 30);
List<Teacher> list1 = query1.list();
for (Teacher teacher : list1) {
System.out.println(teacher.getTid()+teacher.getTname());
}
}
13.minelement(), maxelement()
对集合中元素生成的列进行操作
//minelement(), maxelement() 返回集合中的元素主键最大/最小的元素
@Test
public void test17(){
Query query = session.createQuery("select maxelement(t.students) from Teacher t");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+":"+student.getName()+":"+student.getJava());
}
System.out.println("===============================");
Query query1 = session.createQuery("select minelement(t.students) from Teacher t");
List<Student> list1 = query1.list();
for (Student student : list1) {
System.out.println(student.getId()+":"+student.getName()+":"+student.getJava());
}
}
14.minindex(), maxindex()
对集合中的排序列进行操作。
对于索引了(有序)的集合,可以使用minindex 与 maxindex函数来引用到最小与最大的索引序数。
同理,可以使用minelement 与 maxelement函数来 引用到一个基本数据类型的集合中最小与最大的元素。(如上)
List<Order> orders = session.createQuery("select o from Order o where minindex(o.orderItems) = ?").setParameter(0,0).list();
List<Order> orders = session.createQuery("select o from Order o where maxindex(o.orderItems) = ?").setParameter(0,0).list();

子查询
Hibernate的子查询与SQL语句中的子查询一样,子查询部分放在in、not in里面.
//把老师的id和学生的id一样的学生查询出来
@Test
public void test19(){
Query query = session.createQuery("select s from Student s where s.id in (select t.tid from Teacher t)");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
}
多态查询
当持久化类存在继承关系时,查询父类时,它会把父类所有的对象查询出来,而且也会把所有子类对象查询出来。
//查询所有
@Test
public void test20(){
//Query query = session.createQuery("select o from java.lang.Object o");
Query query = session.createQuery("from java.lang.Object");
List list = query.list();
System.out.println(list.size());
}
命名查询
把所有hql语句写在一个单独的配置文件中.
一般在实际的项目中用得比较多,它会把比较复杂的hql语句写在一个单独的配置文件中,
方便以后对hql语句进行优化,也方便统一管理.
1.第一种方式*.hbm.xml
A.创建Query.hbm.xml
在官方下载的项目里搜索*.hbm.xml,拷贝一个文件到自己的项目里,修改文件名(任意),修改文件内容:
<!-- 定义HQL查询语句 -->
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<query name="hql_student_xml">from Student</query>
</hibernate-mapping>

B.配置到 hibernate.cfg.xml

C.代码使用
@Test
public void test21(){
Query query = session.getNamedQuery("hql_student_xml");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName());
}
}
2.第二种方式在持久类上加注解
package com.rong.entity.group; 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.NamedQueries;
import javax.persistence.NamedQuery; @Entity
//配置多个命名查询hql语句
@NamedQueries(value={@NamedQuery(name="query1",query="select s from Student s where s.name like ?")
,@NamedQuery(name = "query2", query = "from Student")})
//只能配置单个命名查询hql语句,一个类中该注解只能使用一次!
@NamedQuery(name = "query3", query = "select count(s) from Student s")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private int math;
private int java;
@ManyToOne(targetEntity=Teacher.class,fetch=FetchType.LAZY)
@JoinColumn(name="t_id",referencedColumnName="tid")
private Teacher teacher;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getJava() {
return java;
}
public void setJava(int java) {
this.java = java;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
@Test
public void test22(){
Query query1 = session.getNamedQuery("query1");
query1.setParameter(0, "%ab%");
List<Student> list1 = query1.list();
for (Student student : list1) {
System.out.println(student.getId()+student.getName());
} Query query2 = session.getNamedQuery("query2");
List<Student> list2 = query2.list();
for (Student student : list2) {
System.out.println(student.getId()+student.getName());
} Query query3 = session.getNamedQuery("query3");
Object uniqueResult = query3.uniqueResult();
System.out.println(uniqueResult);
}
Hibernate(七)的更多相关文章
- Hibernate(七)一对一映射
一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...
- hibernate(七) hibernate中查询方式详解
序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...
- Hibernate(七)__多对一 、一对多、 一对一、多对多
1.many-to-one 以学生和部门之间的关系为例: Department.hbm.xml <?xml version="1.0" encoding="utf- ...
- 2、hibernate七步走完成增删改查
一.hibernate框架介绍如下 1.框架=模板 2.Hibernate是对象模型与关系数据库模型之间的桥梁 3.hibernate持久化概念 什么是ORM ORM是对象关系映射,是一种数据持久化操 ...
- Java之旅hibernate(8)——基本关系映射
何为关系,何为映射,关系这个词想必大家都不陌生.比方你和老师之间是师生关系,你和父母之间是父子或者父女(母子或者母女关系). 关系是存在某种联系物体之间产生的.什么都是可能的.比方你和工具,你仅仅能使 ...
- Hibernate映射解析——七种映射关系
首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对 ...
- SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系
ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据 ...
- SSH:Hibernate框架(七种关联关系映射及配置详解)
概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...
- Hibernate的七种映射关系之七种关联映射(二)
继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.pri ...
- Hibernate的七种映射关系之基本映射
说到关系,在这个世界无处不在,我们必须以某个关系的节点存在在这个世界网中.比如父子关系,师生关系,上下属关系甚至是危险关系.数据也是一样的,它的存在必为某其他节点做准备. Hibernate有七种映射 ...
随机推荐
- iOS 基于APNS消息推送原理与实现(包括JAVA后台代码)
Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple ...
- 基于EasyX库的贪吃蛇游戏——C语言实现
接触编程有段时间了,一直想学习怎么去写个游戏来练练手.在看了B站上的教学终于可以自己试试怎么实现贪吃蛇这个游戏了.好了,废话不多说,我们来看看如何用EasyX库来实现贪吃蛇. 一.准备 工具vc++6 ...
- 直流电机驱动,TIMER口配置
电机的电压输出能力和频率有关??? 修改前:------------------------------------------------------------------------------ ...
- LIFO栈 ADT接口 数组实现
LIFO 栈结构 typedef int ElemenType; struct seqStack{ ElemeType data[MaxSize]; int top; }; typedef struc ...
- 实现虚拟机和宿主机之间的复制、粘贴(ubuntu系统)
参考:https://blog.csdn.net/weixin_37850264/article/details/79057886 https://blog.csdn.net/zldz14/artic ...
- 20155216 实验二 Java面向对象程序设计
实验二:Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD. 2.理解并掌握面向对象的三要素:封装.继承.多态. 3.初步掌握UML建模. 4.熟悉S.O.L.I.D原则. 5.了解设计 ...
- (The application/json Media Type for JavaScript Object Notation (JSON))RFC4627-JSON格式定义
原文 http://laichendong.com/rfc4627-zh_cn/ 摘要 JavaScript Object Notation (JSON)是一个轻量级的,基于文本的,跨语言的数据交换 ...
- C#基础之Equals和Dispose
1.equal()和运算符==的区别 由于C#中有值类型和引用类型,那么相等也分为值相等和引用相等.先来看一个值类型简单的例子,顺便也写了string类型的比较. static void Main(s ...
- KVM克隆CentOS6虚拟机后无法启动
启动网卡报如下错误: Bringing up interface eth0: Device eth0 does not seem to be present,delaying initializati ...
- IIC通讯程序
IIC程序 IIC起始信号 void IIC_Start(void) { SDA_OUT();//sda设为输出 IIC_SDA=; IIC_SCL=; delay_us();//延时一段时间,具体时 ...