如何在hibernate+mySQL中使用HQL的cast语句
1个回答
2016-09-20
展开全部
在hibernate+mySQL中使用HQL的cast语句
上次我们一起学习了用Criteria进行相关的操作,但由于Criteria并不是Hibernate官方推荐的查询方式,我们也并不多用。现在我们来看一下官方推荐的HQL,一起学习一下它的强大。
说是HQL,也就是Hibernate查询语句,和SQL有什么区别呢?一个字母的区别,哈哈。
当然不是这样,HQL和SQL的区别在于思想的不同,HQL是用面向对象的方向进行查询,而SQL则是对数据库二维表进行查询,这里包含的是思想的不同。HQL实际上也是SQL,它由Hibernate帮我们在内部进行转换,生成SQL。
1)废话不多说,我们直接看一下它的强大。
from User
这个代码很熟悉吧,因为我们在SQL中经常也用到from 表名,但这里有点不同的是User在这里并不是表名,而是实体类的名称,由hibernate帮我们进行映射。
联想SQL语句,如果我们想查出某个属性,并且根据某个属性进行条件限制,很简单可以得到类似语句:
?
1
select usr.name,usr.age from User where usr.age > 20 and usr.age < 60
这样我们就查出了年龄大于20且小于60的User的姓名和年龄。很容易理解。
SQL语句中的and,or,like,<,>,=等都可以在HQL中进行使用。
需要注意的是当我们查询多个属性时,返回的结果是一个Object[]数组,而只有单个时是返回Object,这个需要不同的解析方式,所以在查询时需要注意。
2)当然,我们前面说了HQL是面向对象的,而我们这样做,就不是面向对象的思想了。我们来改一下:
?
1
select new User(usr.name,usr.age) from User usr where usr.age > 20
这样我们就把查询到的结果放到了User对象中,注意,这里调用的是User的构造函数,User类中必须存在接收两个参数的User构造函数,否则会报错,错误信息大概如下:
?
1
Unable to locate appropriate constructor on class [org.hibernate.tutorial.domain8.User]
它找不到合适的构造函数。很明白,加上接收对应参数的构造函数就可以了。
注意,上面当我们进行查出的时候并没有查出相应的ID,如果此时我们调用saveOrUpdate方法时,它实际上执行的是保存的操作。
我们看一下测试代码:
我在执行完上面的查询语句后,进行下面的操作:
?
1
2
3
4
5
while(iter.hasNext()) {
User user = (User)iter.next();
user.setName("sun2");
session.saveOrUpdate(user);
}
这时Hibernate的语句为:
?
1
Hibernate: insert into USER (USER_NAME, age) values (?, ?)
它新插入一条,而不是更新。
那么如果我们需要它进行更新的时候就需要把ID一起查出:
?
1
select new User(usr.name,usr.age,usr.id) from User usr where usr.age > (select avg(usr.age) from usr)
记得修改User构造方法。
这时我们再执行我们的测试代码,此时会得到:
?
1
Hibernate: update USER set USER_NAME=?, age=? where USER_ID=?
3)我们可以在HQL语句中加上SQL函数:
?
1
select usr.name from User usr where usr.age > (select avg(usr.age) from usr)
这段HQL查出年龄大于平均年龄的User的name。
4)在Hibernate 3中我们可以很方便地更新和删除对象,而不必像2中需要先load然后再delete,我们可以直接一条语句搞定:
?
1
update User set name='123123' where name='sun33'
删除语句类似:
?
1
delete User where name='123123'
上次我们一起学习了用Criteria进行相关的操作,但由于Criteria并不是Hibernate官方推荐的查询方式,我们也并不多用。现在我们来看一下官方推荐的HQL,一起学习一下它的强大。
说是HQL,也就是Hibernate查询语句,和SQL有什么区别呢?一个字母的区别,哈哈。
当然不是这样,HQL和SQL的区别在于思想的不同,HQL是用面向对象的方向进行查询,而SQL则是对数据库二维表进行查询,这里包含的是思想的不同。HQL实际上也是SQL,它由Hibernate帮我们在内部进行转换,生成SQL。
1)废话不多说,我们直接看一下它的强大。
from User
这个代码很熟悉吧,因为我们在SQL中经常也用到from 表名,但这里有点不同的是User在这里并不是表名,而是实体类的名称,由hibernate帮我们进行映射。
联想SQL语句,如果我们想查出某个属性,并且根据某个属性进行条件限制,很简单可以得到类似语句:
?
1
select usr.name,usr.age from User where usr.age > 20 and usr.age < 60
这样我们就查出了年龄大于20且小于60的User的姓名和年龄。很容易理解。
SQL语句中的and,or,like,<,>,=等都可以在HQL中进行使用。
需要注意的是当我们查询多个属性时,返回的结果是一个Object[]数组,而只有单个时是返回Object,这个需要不同的解析方式,所以在查询时需要注意。
2)当然,我们前面说了HQL是面向对象的,而我们这样做,就不是面向对象的思想了。我们来改一下:
?
1
select new User(usr.name,usr.age) from User usr where usr.age > 20
这样我们就把查询到的结果放到了User对象中,注意,这里调用的是User的构造函数,User类中必须存在接收两个参数的User构造函数,否则会报错,错误信息大概如下:
?
1
Unable to locate appropriate constructor on class [org.hibernate.tutorial.domain8.User]
它找不到合适的构造函数。很明白,加上接收对应参数的构造函数就可以了。
注意,上面当我们进行查出的时候并没有查出相应的ID,如果此时我们调用saveOrUpdate方法时,它实际上执行的是保存的操作。
我们看一下测试代码:
我在执行完上面的查询语句后,进行下面的操作:
?
1
2
3
4
5
while(iter.hasNext()) {
User user = (User)iter.next();
user.setName("sun2");
session.saveOrUpdate(user);
}
这时Hibernate的语句为:
?
1
Hibernate: insert into USER (USER_NAME, age) values (?, ?)
它新插入一条,而不是更新。
那么如果我们需要它进行更新的时候就需要把ID一起查出:
?
1
select new User(usr.name,usr.age,usr.id) from User usr where usr.age > (select avg(usr.age) from usr)
记得修改User构造方法。
这时我们再执行我们的测试代码,此时会得到:
?
1
Hibernate: update USER set USER_NAME=?, age=? where USER_ID=?
3)我们可以在HQL语句中加上SQL函数:
?
1
select usr.name from User usr where usr.age > (select avg(usr.age) from usr)
这段HQL查出年龄大于平均年龄的User的name。
4)在Hibernate 3中我们可以很方便地更新和删除对象,而不必像2中需要先load然后再delete,我们可以直接一条语句搞定:
?
1
update User set name='123123' where name='sun33'
删除语句类似:
?
1
delete User where name='123123'
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询