Hibernate hql

本文详细介绍了HQL与SQL的相似语法,包括选择、删除、更新等操作的实现方式,通过Java代码实例展示了如何使用HQL进行数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HQL与sql相似语法
[select/delete/update…][from…][where…][group by…][having…][order by…]
 
 
代码结构和使用的jar包
 
 
Man.java
package com.orange.demo;

public class Man {
	private Integer id;
	private String name;

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

}


Test.java

package com.orange.demo;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;


public class Test {
	
	private static SessionFactory sessionFactory = null;
	static{
		Configuration cfg = new Configuration();
		cfg.configure("hibernate.cfg.xml");		//在src目录下
		sessionFactory = cfg.buildSessionFactory();
	}
	
	public static void main(String[] args) {
		try {
//			save();
//			query1();
//			query2();
//			query3(10);
//			query4();
//			query5();
//			query6();
//			query7();
//			delete();
			update();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 增加测试数据
	 */
	public static void save() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction tx =  session.beginTransaction();
		Man man = null;
		for(int i = 1;i<=10;i++){
			man = new Man();
			man.setName("大橙子_"+i);
			session.save(man);
		}

		tx.commit();
		session.close();
	
	}
	

	/**
	 * 查询表的所有字段(查询对象的所有属性)
	 */

	public static void query1() throws Exception {
		Session session = sessionFactory.openSession();
		//hql 查询的都是类名和类的属性
		String hql = "from Man where id > 5 order by id desc";
		List<Man> list = session.createQuery(hql).list();
		for(Man m : list){
			System.out.println(m.getId()+"---"+m.getName());
		}
		session.close();
	}
	/**
	 * 返回表的多个列
	 */
	public static void query2() throws Exception {
		Session session = sessionFactory.openSession();
		//hql 查询的都是类名和类的属性
		String hql = "select id,name from Man where id < 5 ";
		
		List list = session.createQuery(hql).list();
		for(Object obj : list){
			//返回多个列时要将返回的结构转成数组,数组的顺序和hql查询的顺序一致
			System.out.println(Arrays.toString((Object[])obj) );
		}
		session.close();
	}
	
	/**
	 * 返回一个一条数据,并且使用占位符
	 */
	public static void query3(int id) throws Exception {
		Session session = sessionFactory.openSession();
		String hql = "from Man where id = ? ";
		//uniqueResult方法返回一条数据,返回多条会报错
		Man man = (Man) session.createQuery(hql).setParameter(0, id).uniqueResult();
		System.out.println(man.getName());
		session.close();
	}
	
	/**
	 * 指定hql参数的名称
	 */
	public static void query4() throws Exception {
		Session session = sessionFactory.openSession();
		String hql = "from Man  where id between :idMin and :idMax ";
		List<Man> list = session.createQuery(hql).setParameter("idMin", 3).setParameter("idMax", 5).list();
		for(Man m : list){
			System.out.println(m.getId()+"---"+m.getName());
		}
		session.close();
	}
	
	/**
	 *分页查询
	 */
	
	public static void query5() throws Exception {
		Session session = sessionFactory.openSession();
		String hql = "FROM Man";
		Query query = session.createQuery(hql);
		query.setFirstResult(5);	//开始记录数
		query.setMaxResults(3);		//查询的条数	
		List<Man> list = query.list();
		for(Man m : list){
			System.out.println(m.getId()+"---"+m.getName());
		}
		session.close();
	}
	/**
	 * 从配置文件Man.hbm.xml获取hql,
	 * 聚合查询 count
	 */
	public static void query6() throws Exception {
		Session session = sessionFactory.openSession();
		//uniqueResult方法返回一条数据,返回多条会报错
		Long count =  (Long)session.getNamedQuery("countquery").uniqueResult();
		System.out.println(count);
		session.close();
	}
	
	/**
	 *  in 查询
	 */
	
	public static void query7() throws Exception {
		Session session = sessionFactory.openSession();
		//uniqueResult方法返回一条数据,返回多条会报错
		Query query = session.getNamedQuery("inquery").setParameterList("id", new Object[] { 3,6,9});
		List<Man> list = query.list();
		for(Man m : list){
			System.out.println(m.getId()+"---"+m.getName());
		}
		session.close();
	}

	public static void delete() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		String hql = "DELETE FROM Man t WHERE t.id = 3 or t.id >8";
		int result = session.createQuery(hql).executeUpdate();
		System.out.println("删除 " + result + "行数据");
		tx.commit();
		session.close();
	}
	
	
	public static void update() throws Exception {
		
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		String hql_select = "from Man where id = ? ";
		String hql_update = "update Man t set name = ? WHERE t.id =2";
		Man man = null;
		
		//查询id=2的
		man = (Man) session.createQuery(hql_select).setParameter(0, 2).uniqueResult();
		System.out.println(man.getName());
		
		//修改id=2的name
		int result = session.createQuery(hql_update).setParameter(0, "orange33444").executeUpdate();
		System.out.println("更新 " + result + "行数据");
		
		session.refresh(man);	//刷新session缓存
		//再次查询id=2的
		man = (Man) session.createQuery(hql_select).setParameter(0, 2).uniqueResult();
		System.out.println(man.getName());
		
		tx.commit();
		session.close();
	}
}


update方法中如果没有session.refresh(man)这句,更新前和更新后的name值是一样的,这是因为session缓存的缘故,要想查看更新后的值,要在第二次查询前加session.refresh(man)来刷新session缓存

Man.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.orange.demo" auto-import="true">
	<class name="Man" table="t_man">
		<id name="id" column="t_id">
			<generator class="native"></generator>
		</id>
		<property name="name" column="t_name" type="string"></property>
	</class>
	
	
	<query name="countquery">
			SELECT COUNT(*) FROM Man
	</query>
	<query name="inquery">
		
		<![CDATA[
		 FROM Man t where t.id in (:id) 
		]]>
	</query>
</hibernate-mapping>

设置了auto-import="true"后在写hql时直接from 类名即可,如果设置auto-import="false",写hql时from后要写类的包名加类名,如com.orange.demo.Man

hql中可能会写 '<' 或'>' ,这样会被认为是xml的左或右尖括号,所以需要转义,这种情况将hql写在CDATA中就可以了

hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory name="foo">
			<!-- 数据库方言 --> 
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="connection.url">jdbc:mysql://localhost:3306/t1?characterEncoding=UTF-8</property>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.username">root</property>
		<property name="hibernate.connection.password">123456</property>
		<!-- 在控制台打印SQL,但不能打印建表语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 打印SQL是否格式化 false:不格式化 -->
		<property name="hibernate.format_sql">false</property>
		<!--自动更新数据库结构 -->
		<property name="hbm2ddl.auto">update</property>
		
		<mapping resource="com/orange/demo/Man.hbm.xml"/>
	
	</session-factory>
</hibernate-configuration>


hql还支持多表连接和group by查询这里就不演示了。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值