1. NativeSQL > HQL > EJB QL(JP QL 1.0) > QBC(Query By Criteria) > QBE(Query By Example)
2. 总结:QL应该和导航关系结合,共同为查询提供服务。

以下图为例:

Category:

 package com.bjsxt.hibernate;

 import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; @Entity
public class Category { private Integer id; private String name; @Id
@GeneratedValue
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

Topic:

 package com.bjsxt.hibernate;

 import java.util.Date;

 import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne; @Entity
public class Topic { private Integer id; private String title; private Category category; private Date createDate; @Id
@GeneratedValue
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} @ManyToOne(fetch=FetchType.LAZY)
public Category getCategory() {
return category;
} public void setCategory(Category category) {
this.category = category;
} public Date getCreateDate() {
return createDate;
} public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}

Msg:

 package com.bjsxt.hibernate;

 import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne; @Entity
public class Msg { private Integer id; private String cont; private Topic topic; @Id
@GeneratedValue
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getCont() {
return cont;
} public void setCont(String cont) {
this.cont = cont;
} @ManyToOne
public Topic getTopic() {
return topic;
} public void setTopic(Topic topic) {
this.topic = topic;
}
}

MsgInfo:

 package com.bjsxt.hibernate;

 //VO(Value Object) DTO(Data Transfer Object)
public class MsgInfo { private Integer id; private String cont; private String topicName; private String categoryName; public MsgInfo(Integer id,String cont,String topicName,String categoryName){
this.id = id;
this.cont = cont;
this.topicName = topicName;
this.categoryName = categoryName;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getCont() {
return cont;
} public void setCont(String cont) {
this.cont = cont;
} public String getTopicName() {
return topicName;
} public void setTopicName(String topicName) {
this.topicName = topicName;
} public String getCategoryName() {
return categoryName;
} public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
}

HibernateQLTest1:

 package com.bjsxt.hibernate;

 import java.util.Date;
import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; public class HibernateQLTest {
private static SessionFactory sf = null; @Before
public void beforeClass(){
// new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
sf = new AnnotationConfiguration().configure().buildSessionFactory();
} @After
public void afterClass(){
if(sf != null){
sf.close();
}
} @Test
public void testSave(){ Session session = sf.getCurrentSession();
session.beginTransaction(); for(int i=0; i<10; i++){
Category c = new Category();
c.setName("c" + i);
session.save(c);
} for(int i=0; i<10; i++){
Category c = new Category();
c.setId(1);
Topic t = new Topic();
t.setCategory(c);
t.setCreateDate(new Date());
t.setTitle("t"+i);
session.save(t);
} for(int i=0; i<10; i++){
Topic t = new Topic();
t.setId(1);
Msg m = new Msg();
m.setTopic(t);
m.setCont("m" + i);
session.save(m);
} session.getTransaction().commit();
} @Test
public void testHQL_01(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = (Query) session.createQuery("from Category");
List<Category> categories = (List<Category>)q.list();
for(Category c : categories){
System.out.println(c.getName());
}
session.getTransaction().commit();
} @Test
public void testHQL_02(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = (Query) session.createQuery("from Category c where c.name > 'c5'");
List<Category> categories = (List<Category>)q.list();
for(Category c : categories){
System.out.println(c.getName());
}
session.getTransaction().commit();
} @Test
public void testHQL_03(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = (Query) session.createQuery("from Category c order by name desc");
List<Category> categories = (List<Category>)q.list();
for(Category c : categories){
System.out.println(c.getName());
}
session.getTransaction().commit();
} @Test
public void testHQL_04(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = (Query) session.createQuery(
"select distinct c from Category c order by name desc");//主键不同
List<Category> categories = (List<Category>)q.list();
for(Category c : categories){
System.out.println(c.getName());
}
session.getTransaction().commit();
} @Test
public void testHQL_05(){
Session session = sf.getCurrentSession();
session.beginTransaction();
/*Query q = (Query) session.createQuery(
"from Category c where c.id > :min and c.id < :max");//主键不同
// q.setParameter("min", 2);
// q.setParameter("max", 8);
q.setInteger("min", 2);
q.setInteger("max", 8);*/ Query q = (Query) session.createQuery("from Category c where c.id > :min and c.id < :max")
.setInteger("min", 2)
.setInteger("max", 8);
List<Category> categories = (List<Category>)q.list();
for(Category c : categories){
System.out.println(c.getId() + "-" +c.getName());
}
session.getTransaction().commit();
} /**
* 链式编程
*/
@Test
public void testHQL_06(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = (Query) session.createQuery("from Category c where c.id > ? and c.id < ?")
.setInteger(0, 2)//索引从0开始
.setInteger(1, 8);
List<Category> categories = (List<Category>)q.list();
for(Category c : categories){
System.out.println(c.getId() + "-" +c.getName());
}
session.getTransaction().commit();
} /**
* 分页
*/
@Test
public void testHQL_07(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = (Query) session.createQuery("from Category c order by name desc");
q.setMaxResults(4);//每页4条
q.setFirstResult(2);//从第二行开始
List<Category> categories = (List<Category>)q.list();
for(Category c : categories){
System.out.println(c.getId() + "-" +c.getName());
}
session.getTransaction().commit();
} /**
* 分页(换一种获取方式)
*/
@Test
public void testHQL_08(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = (Query) session.createQuery("select c.id,c.name from Category c order by name desc");
q.setMaxResults(4);//每页4条
q.setFirstResult(2);//从第二行开始
List<Object[]> categories = (List<Object[]>)q.list();
for(Object[] c : categories){
System.out.println(c[0] + "-" +c[1]);
}
session.getTransaction().commit();
} /**
* 设定 fetch type 为 lazy 后将不会有第二条sql语句
*/
@Test
public void testHQL_09(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.category.id = 1");
List<Topic> topics = (List<Topic>)q.list();
for(Topic t : topics){
System.out.println(t.getId() + "-" + t.getTitle());
// System.out.println(t.getCategory().getName());
}
session.getTransaction().commit();
} /**
* 设定 fetch type 为 lazy 后将不会有第二条sql语句
*/
@Test
public void testHQL_10(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.category.id = 1");
List<Topic> topics = (List<Topic>)q.list();
for(Topic t : topics){
System.out.println(t.getId() + "-" + t.getTitle());
// System.out.println(t.getCategory().getName());
}
session.getTransaction().commit();
} @Test
public void testHQL_11(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Msg m where m.topic.category.id = 1");
for(Object o : q.list()){
Msg m = (Msg)o;
System.out.println(m.getCont());
}
session.getTransaction().commit();
} /**
* VO(Value Object)
* DTO(Data Transfer Object)
*/
@Test
public void testHQL_12(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select new com.bjsxt.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m");
for(Object o : q.list()){
MsgInfo m = (MsgInfo)o;
System.out.println(m.getCont());
}
session.getTransaction().commit();
} //动手测试left right join
//为什么不能直接写 Category 名,而必须写 t.category
//因为有可能存在多个成员变量(同一个类),需要指明哪一个成员变量的连接条件来做连接
@Test
public void testHQL_13(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select t.title,c.name from Topic t join t.category c");
List<Object[]> list = q.list();
for(Object[] o : list){
System.out.println(o[0] + "-" + o[1]);
}
session.getTransaction().commit();
} //学习使用 uniqueResult
@Test
public void testHQL_14(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Msg m where m = :MsgToSearch");//不重要
Msg m = new Msg();
m.setId(1);
q.setParameter("MsgToSearch", m); Msg mResult = (Msg)q.uniqueResult();
System.out.println(mResult.getCont()); session.getTransaction().commit();
} @Test
public void testHQL_15(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select count(*) from Msg m"); long count = (Long)q.uniqueResult();
System.out.println(count);
session.getTransaction().commit();
} @Test
public void testHQL_16(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select max(m.id), min(m.id), avg(m.id), sum(m.id) from Msg m"); Object[] o = (Object[])q.uniqueResult();
System.out.println(o[0] + "-" + o[1] + "-" + o[2] + "-" + o[3]); session.getTransaction().commit();
} @Test
public void testHQL_17(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Msg m where m.id between 3 and 5"); for(Object o : q.list()){
Msg m = (Msg)o;
System.out.println(m.getId() + "-" +m.getCont());
} session.getTransaction().commit();
} @Test
public void testHQL_18(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Msg m where m.id in(3,4,5)"); for(Object o : q.list()){
Msg m = (Msg)o;
System.out.println(m.getId() + "-" +m.getCont());
} session.getTransaction().commit();
} @Test
public void testHQL_19(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Msg m where m.cont is not null"); for(Object o : q.list()){
Msg m = (Msg)o;
System.out.println(m.getId() + "-" +m.getCont());
} session.getTransaction().commit();
} @Test
public void testSchemaExport(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
} public static void main(String[] args) {
// new HibernatTreeTest().testSave();
new HibernateQLTest().beforeClass();
} }

HibernateQLTest2:

 package com.bjsxt.hibernate;

 import java.util.Date;
import java.util.List; import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; public class HibernateQLTest {
private static SessionFactory sf = null; @Before
public void beforeClass(){
// new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
sf = new AnnotationConfiguration().configure().buildSessionFactory();
} @After
public void afterClass(){
if(sf != null){
sf.close();
}
} @Test
public void testSave(){ Session session = sf.getCurrentSession();
session.beginTransaction(); for(int i=0; i<10; i++){
Category c = new Category();
c.setName("c" + i);
session.save(c);
} for(int i=0; i<10; i++){
Category c = new Category();
c.setId(1);
Topic t = new Topic();
t.setCategory(c);
t.setCreateDate(new Date());
t.setTitle("t"+i);
session.save(t);
} for(int i=0; i<10; i++){
Topic t = new Topic();
t.setId(1);
Msg m = new Msg();
m.setTopic(t);
m.setCont("m" + i);
session.save(m);
} session.getTransaction().commit();
} //is empty and is not empty
@Test
public void testHQL_20(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.msgs is empty"); for(Object o : q.list()){
Topic t = (Topic)o;
System.out.println(t.getId() + "-" +t.getTitle());
} session.getTransaction().commit();
} @Test
public void testHQL_21(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.title like '%5'"); for(Object o : q.list()){
Topic t = (Topic)o;
System.out.println(t.getId() + "-" +t.getTitle());
} session.getTransaction().commit();
} @Test
public void testHQL_22(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.title like '_5'"); for(Object o : q.list()){
Topic t = (Topic)o;
System.out.println(t.getId() + "-" +t.getTitle());
} session.getTransaction().commit();
} //不重要
@Test
public void testHQL_23(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select lower(t.title),"
+ "upper(t.title),"
+ "trim(t.title),"
+ "concat(t.title,'***'),"
+ "length(t.title) "
+ "from Topic t"); for(Object o : q.list()){
Object[] arr = (Object[])o;
System.out.println(arr[0] + "-" + arr[1] + "-" + arr[2] + "-" + arr[3] + "-" + arr[4]);
} session.getTransaction().commit();
} @Test
public void testHQL_24(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select abs(t.id),"
+ "sqrt(t.id),"
+ "mod(t.id,2) "
+ "from Topic t"); for(Object o : q.list()){
Object[] arr = (Object[])o;
System.out.println(arr[0] + "-" + arr[1] + "-" + arr[2]);
} session.getTransaction().commit();
} @Test
public void testHQL_25(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select current_date,current_time,current_timestamp,t.id from Topic t"); for(Object o : q.list()){
Object[] arr = (Object[])o;
System.out.println(arr[0] + "|" + arr[1] + "|" + arr[2] + "|" + arr[3]);
} session.getTransaction().commit();
} @Test
public void testHQL_26(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.createDate < :date");
q.setParameter("date", new Date()); for(Object o : q.list()){
Topic t = (Topic)o;
System.out.println(t.getTitle());
} session.getTransaction().commit();
} @Test
public void testHQL_27(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select t.title, count(*) from Topic t group by t.title"); for(Object o : q.list()){
Object[] arr = (Object[])o;
System.out.println(arr[0] + "|" + arr[1]);
} session.getTransaction().commit();
} @Test
public void testHQL_28(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("select t.title, count(*) from Topic t group by t.title having count(*) > 0"); for(Object o : q.list()){
Object[] arr = (Object[])o;
System.out.println(arr[0] + "|" + arr[1]);
} session.getTransaction().commit();
} @Test
public void testHQL_29(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.id < (select avg(t.id) from Topic t)"); for(Object o : q.list()){
Topic t = (Topic)o;
System.out.println(t.getTitle());
} session.getTransaction().commit();
} @Test
public void testHQL_30(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.id < ALL (select t.id from Topic t where mod(t.id,2) = 0)"); for(Object o : q.list()){
Topic t = (Topic)o;
System.out.println(t.getTitle());
} session.getTransaction().commit();
} //用in可以实现 exists 的功能
//但是 exists 执行效率高
@Test
public void testHQL_31(){
Session session = sf.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where not exists (select m.id from Msg m where m.topic.id = t.id)");//就是沒有回帖的topic for(Object o : q.list()){
Topic t = (Topic)o;
System.out.println(t.getTitle());
} session.getTransaction().commit();
} @Test
public void testHQL_32(){
Session session = sf.getCurrentSession();
session.beginTransaction(); Query q = session.createQuery("update Topic t set t.title = upper(t.title)");
q.executeUpdate();
q = session.createQuery("from Topic");
for(Object o : q.list()){
Topic t = (Topic)o;
System.out.println(t.getTitle());
} q = session.createQuery("update Topic t set t.title = lower(t.title)");
q.executeUpdate(); session.getTransaction().commit();
} //不重要
@Test
public void testHQL_33(){
Session session = sf.getCurrentSession();
session.beginTransaction(); Query q = session.getNamedQuery("topic.selectCertainTopic");
q.setParameter("id", 5);
Topic t = (Topic)q.uniqueResult();
System.out.println(t.getTitle()); session.getTransaction().commit();
} //Native(不太重要)
@Test
public void testHQL_34(){
Session session = sf.getCurrentSession();
session.beginTransaction(); SQLQuery q = session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class);
List<Category> categories = (List<Category>)q.list();
for(Category c : categories){
System.out.println(c.getName());
} session.getTransaction().commit();
} @Test
public void testSchemaExport(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
} public static void main(String[] args) {
// new HibernatTreeTest().testSave();
new HibernateQLTest().beforeClass();
} }

jar包链接: https://pan.baidu.com/s/1slvwzbn 密码: hwef

代码链接1: https://pan.baidu.com/s/1skCHfU9 密码: ka73

代码链接2: https://pan.baidu.com/s/1qYruCUC 密码: v4eb

HQL(Hibernate Query Language)的更多相关文章

  1. Hibernate hql(hibernate query language)基础查询

    在开发过程中,数据库的操作我们其实更多的用到的是查询功能,今天开始学习hql的查询. 1.加入必要的工具 2.Hibernate配备的一种非常强大的查询语言,这种查询语言看上去很像sql.但是不要被语 ...

  2. HQL(Hibernate Query language)语言

    现在有两张表:student(学生表),classroom(教室表). //对象 Student 对应 student 表中有四个字段,分别是:id,name,age,classroom; publi ...

  3. HQL: The Hibernate Query Language

    Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Ass ...

  4. Hibernate查询(HQL——Hibernate Query Language)

    HQL查询 HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作.而且HQL是面向对象的,具备继承,多态和关联等特性. from子句: ...

  5. 数据查询语句:DQL(Data Query Language)

    一.基础查询 1.语法:select 查询列表 from 表名; 2.特点:1.通过select查询完的结果,是一个虚拟的表格,不是真实存在   2.查询列表可以是:字段.表达式.常量.函数等   3 ...

  6. 数据库系统概述(Data Model、DBMS、DBS、RDBS、Structured Query Language)

    数据Data 描述事物的符号记录成为数据. 数据是数据库中存储的基本对象.   除了基本的数字之外.像图书的名称.价格.作者都可以称为数据. 将多种数据记录列成一张表.通过数据表管理数据. 每一行的数 ...

  7. hql(Hibernate Query Language)

    1.Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate ...

  8. 数据库原理及应用-用户接口及SQL查询语言(Query Language)

    2018-02-07 20:41:39 一.DBMS的用户接口 查询语言 访问DBMS的访问工具(GUI) API 相关类库 二.SQL语言 SQL语言可以细分为四种: 1.Data Definiti ...

  9. Hibernate Query Language查询:

    Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...

随机推荐

  1. python---day14( 内置函数二)

    内置函数二一:匿名函数 lambda函数 lambda 表示匿名函数,不需要用def 来申明. 语法: 函数名=lambda 参数:返回值 ----〉 案例:f=lambda n:n*n 例子01: ...

  2. C++_类入门2-使用类

    进一步探讨类的特征,重点是类设计技术,而不是通用原理.一些特性很容易,一些特性很微妙. 运算符重载 目的是使C++操作更美观,更接近于内置类型的操作. 隐藏了内部的实现机理,并强调了实质. 格式:op ...

  3. JavaScript 中this 初步理解笔记

    Javascript中函数中的this通常指向的是函数的拥有者,这个拥有者就是上下文执行对象:另外一点需要注意,this只能在javascript函数内部使用.

  4. A计划(三维dfs)

    可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下 ...

  5. 使用PHP并发执行任务–curl_multi应用

    使用PHP并发执行任务–curl_multi应用 原网址:http://lampblog.org/category/phpdev

  6. dedecms 中变量函数

    {dede:global.cfg_cmsurl/} 是网站根目录{dede:global.cfg_cmsurl/} 是当前目录{dede:global.cfg_templets_skin/} 当前模板 ...

  7. webpacke

    webpacke   安装 首先要安装 Node.js, Node.js 自带了软件包管理器 npm 用npm 安装webpack $ npm install webpack -g 此时 Webpac ...

  8. js数组去重 javascript版

    //js数组去重 //思路: // 1.放入第一个元素 // 2.放入第n个元素,和第n个之前的元素就行比较,如果有重复,则跳过.没有重复就加入数组中 // 3.返回新的去重后数组 Array.pro ...

  9. hdu 1237 简单计算器(栈处理)

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. aoj0118

    一.题意:有三种水果分别用,'@','*','#'三种符号表示,上下左右相连的同种水果被看做是一个区域,问一共有多少个区域 二.思路:用dfs去标记相连区域,然后遍历每个没有被标记的位置进行dfs 三 ...