HQL介绍
-
hql是面向对象查询,格式:from + 类名 + 类对象 + where + 对象的属性
sql是面向数据库表查询,格式:from + 表名 + where + 表中字段 -
hql语句中关键字不区分大小写,但是实体类和对象属性要区分大小写
HQL的参数形式
- 有关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开始。
- 使用命名参数:
定义命名参数固定格式: :参数名称(即: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语句
- 查询实体:
String hql = "from User";
List<User> list= session.createQuery(hql).list();
- 查询单个属性
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)
- 查询其中几列数据,返回一个数组
String hql="SELECT id,name FROM User";
List list= session.createQuery(hql).list();
for(Object obj:list){
System.out.println(Arrays.toString((Object[])obj));
}
- 查询其中几列数据,返回一个实体类
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也会抛出异常,因为这种方式采用的是默认构造。
值得注意的是,如果使用的新构造对象,那么处理指定的属性会被赋予新值外,其它属性均为默认值。
- 通过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 > :minId AND < :maxId
</query>
b. <query name="queryUserRanage">
<![CDATA[FROM User WHERE id > :minId AND < :maxId]]
</query>
- 使用原生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);
}