hibernate的各种查询
Hibernate Query Language(HQL)
Criteria Query
Native SQL
下面对其分别进行解释
select子句:
有时并不需要取得对象的所有属性,这时可以使用select子句进行属性查询,如select s.name from Student s。
例:
{
TRegister user = new TRegister();
Session session = HibernateUtil.currentSession();
Query query = session.createQuery("select u.userName from TRegister u");
List list = query.list();
for(int i = 0 ; i < list.size(); i++)
{
String name = (String)list.get(i);
System.out.println(name);
}
}
如果要查询两个以上的属性桧以数组的方式返回,如下:
{
TRegister user = new TRegister();
Session session = HibernateUtil.currentSession();
Query query = session.createQuery("select u.userName ,u.sex from TRegister u");
List list = query.list();
for(int i = 0 ; i < list.size(); i++)
{
Object obj[] = (Object[])list.get(i);
System.out.println(obj[0]+" 的性别是:"+obj[1]);
}
}
在使用属性查询时,由于使用对象数组,操作和理解不太方便,如果将 一个object[]中所有成员封装成一个对象就方便多了。下面的程序做了示例:
{
Session session = HibernateUtil.currentSession();
Query query = session.createQuery("select new TRegister(u.userName,u.sex) from TRegister u");
List list = query.list();
for(int i = 0 ; i < list.size(); i++)
{
//Object obj[] = (Object[])list.get(i);
TRegister user = (TRegister)list.get(i);
System.out.println(user.getUserName()+" 的性别是:"+user.getSex());
}
/**要正确运行以上程序,需要在TRegister类中加入一个相应的构造函数
public TRegister(String userName,String sex) {
this.userName = userName;
this.sex = sex;
}
*/
}
where子句:
HQL也支持子查询,它通过where子句实现这一机制。where子句可以让用户缩小要返回的实例的列表范围。例如下面语句会返回所有名字为"Bill"的Student实例:
Query query = session.createQuery("from Student as s where s.name='Bill'");
where子句允许出现的表达式包括了SQL中可以使用的大多数情况。
数学操作:+,-,*,/
真假比较操作:=, >=, <=, <>, !=, like
逻辑操作:and ,or, not
字符串连接:||
SQL标题函数 :如upper()和lower()
如果查询返回多条记录,可以用以下关键字来量化
all:表示所有的记录。
any:表示所有记录中的任意一条。
some:与any相同。
in:与any等价。
exists:表示子查询至少要返回一条记录。
例如,下面语句返回所有学生年龄都大于18的班级对象
from Group g where 18<all (select s.age from g.students s)
下列语句返回在所有学生中有一个学生的年龄等于22的班级:
from Group g where 22 = any (select s.age from g.students s)
或者
from Group g where 22= some(select s.age from g.students s)
或者
from Group g where 22 in (select s.age from g.students s)
连接查询
与SQL一样,HQL也支持连接查询,如内连接,外连接和交叉连接:
inner join:内连接
left outer join:左外连接
rigth outer join:右外连接
full join:全连接,但不常用
下面我重点介绍下内连接查询,左外连接和或外连接和内连接大同小异,而全连接几乎没有使用得到的地方。
inner join可以简写为join,例如在查询得到的Group对象时,内连接取得对应的Student对象,实现的程序代码如下:
Group group = null;
Query query = session.createQuery("from Group g join g.students");
List list = query.list();
Object obj[] = null;
for(int i = 0 ; i < list.size(); i++)
{
obj = (Object[])list.get(i);
group = (Group)obj[0];//group是数组是第一个对象
stu = (Student)obj[1];//stu是数组的第二个对象
System.out.println(stu.getName()+"属于"+group.getName());
}
Criteria Query方式
当
查询数据时,往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此处Hibernate还支持Criteria查询,这
种查询方式把查询条件封装为一个Criteria对象。在实际应用中,可以使用Session的createCriteria()方法构建一个
org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add方法加入到Criteria实例中。这样程序员可
以在不使用SQL甚至HQL的情况下进行数据查询。如下:
{
Session session = HibernateUtil.currentSession();
Criteria criteria = session.createCriteria(TRegister.class);//生成一个Criteria实例
criteria.add(Restrictions.eq("userName","fengyan"));//等价于where name = 'fengyan'
List list = criteria.list();
TRegister user = (TRegister)list.get(0);
System.out.println(user.getUserName());
}
List list = criteria.list();
Student stu = (Student)list.get(0);
或者:
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.like("name", "t",MatchMode.START));
List list = criteria.list();
Student stu = (Student)list.get(0);
查询学生姓名在Bill,Jack和Tom之间所有的Student对象
String[] names = {"Bill","Jack","Tom"};
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.in("name", names));
List list = criteria.list();
Student stu = (Student)list.get(0);
查询学生年龄(age)等于22或为空(null)的所有学生对象
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("age", new Integer(22)));
criteria.add(Restrictions.isNull("age"));
List list = criteria.list();
Student stu = (Student)list.get(0);
查询学生姓名以字母F开头的所有Student对象,并按姓名升序排序
Criteria criertia = session.createCriteria(Student.class);
criteria.add(Restrictions.like("name", "F%"));
criteria.addOrder(Order.asc("name"));
List list = criteria.list();
Student stu = (Student)list.get(0);
注意调用Order.asc的方法应该是Criteria.addOrder()方法。
Criteria criertia = session.createCriteria(Group.class);
criteria.setFetchMode("students", FetchMode.EAGER);
criteria.add(Restrictions.like("name", "2005",MatchMode.END));
List list = criteria.list();
以上两种方式编写的代码都使用相同的SQL语句来完成它们的功能,如下:
select g.*, s.* from Group g
left outer join Student s
on g.id = s.group_id
where g.name like '%2005'
String sql = "select {s.*} from t_student s where s.age>22";
//{}用来引用数据表的别名,{s.*}表示使用s来做为t_student表的别名
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity("s",Student.class);
List list = sqlQuery.list();
for(int i = 0 ; i < list.size(); i++)
{
Student stu = (Student)list.get(i);
}
//createSQLQuery(String sql)利用传入的sql参数构造一个SQLQuery实例。使用该方法时,还需要传入查询的实体类,因此在配合使用SQLQuery的addEntity()方法一起使用。
</class>
<sql-query name="QueryStudents">
<![CDATA[
select {s.*} from t_student s where s.age > 22
]]>
<return alias="s" class="Student" />
</sql-query>
</hibernate-mapping>
配合以上配置我们可以如下编写代码来查询
List list = query.list();
for(int i = 0 ; i < list.size();i++)
{
Student stu = (Student)list.get(i);
}
也可以在命名查询是设定参数,如下:
<![CDATA[
select {s.*} from t_student s where s.age > :age
]]>
<return alias="s" class="Student" />
</sql-query>
</hibernate-mapping>
程序代码:
query.setInteger("age",22);
List list = query.list();
for(int i = 0 ; i < list.size();i++)
{
Student stu = (Student)list.get(i);
}
自定义insert , update和delete语句:
Hibernate 3.x的映射文件中新添加<sql_insert>,<sql_update>,<sql-delete>3个标记。可以使用这3个标记自定义自己的insert ,update,delete语句,如:
<sql-insert>
insert into t_student(name,age,id) values(?,?,?)
</sql-insert>
<sql-update>
update t_student set name=?,age=? where id=?
</sql-update>
<sql-delete>
delete from t_student where id = ?
</sql-delete>
</hibernate-mapping>
对于以上自定义的SQL语句,要注意以下几点
1:insert 和update语句中定义的字段必须和映射文件声明的属性相应,一个都不能少。
2:在insert 和update语句中,属性出现的顺序必须和映射文件中的顺序一样。
3:在insert语句中,主键id总是放在最后。
在程序中实现以上自定义的insert语句如下:
stu.setName("Bill");
stu.setAge(22);
session.save(stu);
如果不想在insert或update语句中包括所有属性,则可以在属性定义时 加上insert ="false"或update="false"如下:
<sql-insert>
insert into t_student(age,id) values(?,?)
</sql-inert>
hibernate的各种查询的更多相关文章
- hibernate框架之-查询结果集返回类型
Hibernate支持HQL和SQL的查询,返回结果支持POJO类型或字段/数组的形式. 开发中用Hibernate进行数据库查询,用的是SQL.原来需要查询一个表的几乎所有字段,所以我使用了addE ...
- Hibernate原生SQL查询
最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...
- hibernate的hql查询
1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...
- hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)
hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
- Hibernate应用SQL查询返回实体类型
Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...
- Hibernate五 HQL查询
HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...
- Hibernate三大类查询总结
Hibernate目前总共分为三大类查询:cretiria,hql,本地sql [以下篇章搜集于网络,感谢作者] 第一:关于cretiria的查询 具有一个直观的.可扩展的条件查询API是Hibern ...
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
在Hibernate中如果通过 [java] view plaincopy session.createSQLQuery("select '合计' as name from dual&quo ...
随机推荐
- SDL -安全开发生命周期
1.学习SDL https://www.cnblogs.com/whoami101/p/9914862.html 2.学习SDL https://blog.csdn.net/whatday/artic ...
- 【SpringMVC】拦截器
一.概述 1.1 拦截器的异常场合 1.2 拦截器中的方法 二.示例 2.1 定义两个拦截器 2.2 配置拦截器 2.3 执行顺序 三.拦截器应用 3.1 需求 3.2 用户登陆及退出功能开发 3.3 ...
- 昨天521表白失败,我想用Python分析一下...表白记录和聊天记录
昨天跟喜欢的妹子表白了. 失败了!.下面是表白的聊天记录: (跟妹子已经认识一段时间) 我:灭嘤嘤,我喜欢你. 妹子:你干嘛? 我:今天520,跟你表白鸭. 妹子:那....有多喜欢? 我: 有很多很 ...
- 定制centos6.5自动安装ISO光盘
一 ISO定制项清单 安装系统为centos6.5 (base server),安装方式为全新安装 使用ext4分区格式 安装前可以交互输入root密码,主机名,swap分区大小,之后安装过程自动化 ...
- 笔记一下debian8升级到debian9遇到的几个坑
由于debian8不再维护了,出于安全需要,参照官方的方法,在线升级到debian9,结果遇到了好多坑,虽然没死人,但也够惨了 坑1.升级后,多占了很多空间,莫明奇妙的把 / 分区占的满满的,由于之前 ...
- Windows——Thinkpad 开机显示pwmtr64v.dll找不到指定的模块
解决方法:进入设备管理器,展开系统设备分页,找到Lenovo Power Manager ,右键,更新驱动程序,浏览计算机上的驱动程序, 让我从计算机上的可用驱动程序列表中选取,选择Lenovo Po ...
- Laravel 队列的简单使用例子
场景: 在一个a系统中注册一个用户时,发送请求到b系统中也注册一个相同信息的账号,考虑到网络有可能错误的原因,所以使用队列去处理 1.修改根目录 .env 文件的QUEUE_CONNECTION字段配 ...
- phpstorm快捷键使用
- Python+request 使用pymysql连接数据库mysql的操作《十》
使用指南.pymysql支持python2.7同时也支持python3.x.当前我用的是python2.7.所以过断选择了pymysql的使用,这里注意几点.一般我们连接数据库为了安全起见,都会要求按 ...
- linux 忘记root密码怎么处理。
这个是不少人纠结的地方.一台服务器,太久没使用,然后又没有一个文件txt,excel记录那些密码相关的东西.所以导致很多信息忘记了. 参考文章:https://blog.csdn.net/cranky ...