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有七种映射 ... 
随机推荐
- 两张图证明 WolframAlpha 的强大
			引用于:https://capbone.com/wolfram-alpha/ 两张图证明 WolframAlpha 的强大 之前在" 我手机中有哪些应用 "里提到过 Wolfram ... 
- Linux Mint 使用 VNC Server (x11vnc) 进行远程屏幕
			https://community.linuxmint.com/tutorial/view/2334 This tutorial was adapted from here. Remove the d ... 
- 数据结构与算法之有序数组(2)——in dart
			本文比第一篇,采用了类实现.增加了运算符重载等功能.本来有序数组是不能修改某个位置的值的,因为这样会打破数组的有序性:但为了演示,保留了修改的方法,但为此增加了排序. import 'dart:mat ... 
- 2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客
			2017-2018-1 20155232 <信息安全系统设计基础>第四周学习总结以及课上myod练习补充博客 课上myod练习 1 参考教材第十章内容 2 用Linux IO相关系统调用编 ... 
- 20155234java实验一
			实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没有Linux基础的同学建议先学习Linux基础入门(新版))Vim ... 
- 第八周课上额外项目:pwd的实现
			项目要求: 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 并且上交博客链接. 实验步骤 我首先不懂pwd到底是个 ... 
- 人脸识别引擎SeetaFaceEngine中Identification模块使用的测试代码
			人脸识别引擎SeetaFaceEngine中Identification模块用于比较两幅人脸图像的相似度,以下是测试代码: int test_recognize() { const std::stri ... 
- 二、Django用户认证之cookie和session
			1.cookie原理 Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制.目前Cookie已经成为标准,所有的主流浏览器如IE.Netscape.Firefox.O ... 
- oss上传文件0字节
			最近使用oss上传文件,不同项目中使用的版本也不同,之前的都能正常上传,最近因需要添加ObjectMetaData属性,扩展了一个方法,发现上传的文件始终是0字节的,最终跟源码发现conntentLe ... 
- selenium自动化之切换iframe
			许多人在执行脚本的时候会发现,明明自己的元素路径没写错啊!怎么还是报元素未找到的异常呢?是的,没错,你可能是遇上iframe啦!下面将介绍关于iframe的相关操作. 例子:以163邮箱登录页面为例 ... 
