HQL的基本描述

HQL介绍

  1. hql是面向对象查询,格式:from + 类名 + 类对象 + where + 对象的属性
    sql是面向数据库表查询,格式:from + 表名 + where + 表中字段

  2. hql语句中关键字不区分大小写,但是实体类和对象属性要区分大小写

HQL的参数形式

  1. 有关hql查询语句中的问号参数形式。
    使用?设置参数占位符,之后通过setString()和setInteger()等方法 或 setParameter() 为其赋值。如:
	String hql = "from User user where user.name=? and user.age=? and user.sex=? and ...";
	Query query = session.createQuery(hql);
	query.setString(0,"张三")
	query.setInteger(1,20);
	...

注意:a.需要按顺序把字段值对应好,即?的个数及对应问题。
b.在hibernate中占位符“?”填充参数下表从 0开始。JDBC填充时占位符从1开始。

  1. 使用命名参数:
    定义命名参数固定格式: :参数名称(即:myid ),赋值时,直接写参数名即可:setParameter(“myid”, 1);
    并且不用依照参数的顺序来设置参数,并且使用HQL具有更好的可读性。
    String hql = "from User user where user.name=:var1 and user.age=:var2 and user.sex=:var3 and ...";
    Query query = session.createQuery(hql);
    query.setString("var1","张三")
    ...
    
    	```
    		注意:决不能在HQL中又出现?又出现命名参数,这样程序会报异常。
    

常用的HQL语句

  1. 查询实体:
	String hql = "from User";
	List<User> list= session.createQuery(hql).list();
  1. 查询单个属性
	String hql="SELECT name FROM User where id=1";
	//方式一:
	Object name= session.createQuery(hql).list().get(0);
    System.out.println(name);
	//	但是这种方式不被推荐,当如果id=0的User对象不存在是,使用get(0)会抛出异常,我们通常使用下面这种方式
	
	方式二:通过uniqueResult()方法,该方法返回一个Object对象,如果对象不存在则返回null,如果返回值不唯一,则抛出异常
	Object name= session.createQuery(hql).uniqueResult();
	System.out.println(name)
  1. 查询其中几列数据,返回一个数组
	String hql="SELECT id,name FROM User";
	List list= session.createQuery(hql).list();
	for(Object obj:list){
		System.out.println(Arrays.toString((Object[])obj));
	}
  1. 查询其中几列数据,返回一个实体类
	String hql="SELECT new User(id,name) FROM User";
	List<User> list= session.createQuery(hql).list();
	for(User user:list){
		System.out.println(user);
	}
注意:HQL通过new的方式可以返回一个新的实体类,
比如说上面通过new User(id,name)方式将id,name返回给User,
要求User必须包含一个相对应的构造函数,否则会抛出异常,
同时我们还有应该给User指定一个默认的构造函数,
否则使用From User也会抛出异常,因为这种方式采用的是默认构造。
值得注意的是,如果使用的新构造对象,那么处理指定的属性会被赋予新值外,其它属性均为默认值。
  1. 通过xml文件
    如果我们将HQL代码写在类中,那么编译后我们非常难以维护,为了后期代码的可维护行,我们需要将HQL代码写在对应类的.hbm.xml文件中
	<query name="queryUsers">
		FROM User
	</query>

java代码:

	Query query=session.getNamedQuery("queryUserRanage");
	List<User> list=query
					.list();
	for(User user:list){
		System.out.println(user);
	}
注意:如果在SQL语句中存在>、<等xml中特殊字符,这些字符在xml中都有特殊的意义,
	  所有我们不能直接这样写,需要进行转义或者用CDATA代码块包裹起来
	a. <query name="queryUserRanage">
		FROM User WHERE id &gt; :minId AND &lt; :maxId
	   </query>
	  
	b. <query name="queryUserRanage">
		<![CDATA[FROM User WHERE id > :minId AND < :maxId]]
	   </query>
  1. 使用原生sql
	String sql = "select id,name from user as u where u.name = ? and u.age = ? and ...";
	SQLQuery sqlQuery = session.createSQLQuery(sql);
	sqlQuery.setString(0, user.getName());
	sqlQuery.setString(1, user.getPassword());
	
	List<User> list=sqlQuery.list();
	for(User user:list){
		System.out.println(user);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值