Hibernate--HQL语句

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();
		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;
	}
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值