您的位置:首页 > 其它

Hibernate--HQL语句

2017-07-28 14:55 330 查看
Hibernate--HQL语句
1、HQL是什么?

HQL----->Hibernate Query Language(hql查询语言),是对get()/load()方法的补充。我们都知道,session.get()或者load() 方法时根据表的id来查询表的所有信息的。如果想要实现复杂的查询,我们需要使用hql语句来实现。

  HQL(Hibernate Query Language)提供更加丰富灵活、更为强大的查询能力;

  HQL更接近SQL语句查询语法;

  [select/delete/update…][from…][where…][group by…][having…][order by…]
2、具体的实例如下:

(1)自己新建一个Java工程,添加hibernate3.3支持,连接test数据库

(2)在src下新建com.etc.dao包,在包下新建User.java类:

package com.etc.dao;

public class User {
private int id;
private String username;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + "]";
}

}


(3)在com.etc.dao下新建User.hbm.xml映射文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.etc.dao.User" table="t_user" catalog="test">
<id name="id" type="java.lang.Integer">
<column name="user_id"/>
<generator class="native"/>
</id>
<property name="username" type="java.lang.String">
<column name="user_name"/>
</property>
</class>
</hibernate-mapping>


(4)修改hibernate.cfg.xml配置文件:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- <property name="hbm2ddl.auto">create</property> -->
<property name="current_session_context_class">thread</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="myeclipse.connection.profile">com.mysql.jdbc.Driver</property>
<mapping resource="com/etc/dao/User.hbm.xml"/>
</session-factory>

</hibernate-configuration>


(5)在工程下新建test文件夹,在文件夹下新建com.etc.dao包,在包下新建UserDAOTest.java测试类:

package com.etc.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class UserDAOTest {
@Test
public void testCreate(){
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction(
c162
);
for(int i=0;i<5;i++){
User user = new User();
user.setUsername("zoey"+i);
session.save(user);
}
session.getTransaction().commit();
}
}
(6)去掉hibernate.cfg.xml中的hbm2ddl注释,执行testCreate()方法,在数据库中自动创建相应的表t_user,并且自动插入5条数据。

(7)继续在UserDAOTest.java类中写方法,执行相应的hql查询语句:

package com.etc.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class UserDAOTest {
/**
* Description:自动创建t_user表,并且向表中插入5条数据
* @author zoey
* @date 2017年7月28日
*/
@Test
public void testCreate(){
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
for(int i=0;i<5;i++){
User user = new User();
user.setUsername("zoey"+i);
session.save(user);
}
session.getTransaction().commit();
}
/**
* Description:常用的hql查询语句
* @author zoey
* @date 2017年7月28日
*/
@Test
public void testRetrieve(){
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();

System.out.println("------普通查询-----------");
String hql1 = "from User";
List<User> userList1 = (List<User>) session.createQuery(hql1).list();
for(User user:userList1){
System.out.println(user);
}

System.out.println("------条件查询 where-----------");
String hql2 = "from User where username = 'zoey1'";
List<User> userList2 = (List<User>) session.createQuery(hql2).list();
for(User user:userList2){
System.out.println(user);
}

System.out.println("------模糊查询 like 模糊查询  %模糊匹配   _匹配一个-----------");
String hql3 = "from User where username like '_oey1'";
List<User> userList3 = (List<User>) session.createQuery(hql3).list();
for(User user:userList3){
System.out.println(user);
}

System.out.println("------类的别名-----------");
String hql4 = "from User u where u.username = 'zoey2'";
List<User> userList4 = (List<User>) session.createQuery(hql4).list();
for(User user:userList4){
System.out.println(user);
}

//单个属性查询,得到String的list集合
System.out.println("------多个属性查询,得到一个数组-----------");
String hql5 = "select username from User";
List<String> usernameList = (List<String>)session.createQuery(hql5).list();
for(String s:usernameList){
System.out.println(s);
}

System.out.println("------多个属性查询,得到一个数组-----------");
String hql6 = "select id,username from User";
List<Object[]> objectList = session.createQuery(hql6).list();
for(Object[] object:objectList){
System.out.println(object[0]+","+object[1]);
}

System.out.println("------多个属性查询,使用面对对象的方式,自己封装对象:将User的值存到MyUser中,使之初始化(比较有用)-----------");
String hql7 = "select new com.etc.dao.MyUser(id,username) from User";
List<MyUser> userList5 = session.createQuery(hql7).list();
for(MyUser user:userList5){
System.out.println("MyUser:"+user.getName());
}

System.out.println("------select语句,创建一个list-----------");
String hql8 = "select new list(id,username) from User";
List<List> list = session.createQuery(hql8).list();
for(List l:list){
System.out.println(l.get(0));
}

System.out.println("------函数查询:count(*),count(1)会报错-----------");
String hql9 = "select count(*) from User";
Long count  = (Long) session.createQuery(hql9).uniqueResult();//返回的必须是Long类型
System.out.println(count);

System.out.println("------update 更新-----------");
String hql10 = "update User set username = 'lan' where id = '1'";
Query query = session.createQuery(hql10);
int num = query.executeUpdate();
if(num == 1){
System.out.println("更新成功");
}

System.out.println("------delete 删除-----------");
String hql11 = "delete from User where id = '5'";
Query query2 = session.createQuery(hql11);
int num2 = query2.executeUpdate();
if(num2 == 1){
System.out.println("删除成功");
}

System.out.println("------排序-----------");
String hql12 = "from User order by id desc";
List<User> list3 = session.createQuery(hql12).list();
for(User u:list3){
System.out.println(u);
}

System.out.println("-------分组---------");
String hql13 = "from User group by id";
List<User> list4 = session.createQuery(hql13).list();
for(User u:list4){
System.out.println(u);
}
session.getTransaction().commit();
}
/**
* Description:使用hql查询
* MySQL分页使用limit关键字
* select * from t_user limit 0,3;//从下标0开始,显示3条记录
* Oracle分页使用rownum关键字
* Hql分页使用setFirstResult()、setMaxResults()方法,指定开始的下标、展示记录总数的下标
* @author zoey
* @date 2017年7月28日
*/
@Test
public void testHql(){
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
String hql = "from User";
List<User> userList = session.createQuery(hql).setFirstResult(0).setMaxResults(3).list();
for(User user:userList){
System.out.println(user);
}
session.getTransaction().commit();
}
}
(8)MyUser.java类如下:

package com.etc.dao;

public class MyUser {
private int id;
private String name;
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 MyUser(int id, String name) {
super();
this.id = id;
this.name = name;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: