Hibernate持久层框架使用【七】SQL语句
除了上篇博客介绍的HQL语句外,还可以使用SQL语句来进行数据的查询。
具体如何使用这里直接贴代码了:
首先建一个Sql.class类来测试一下
public class Sql {
public static void main(String[] args) {
// TODO Auto-generated method stub
MySessionFactory mySessionFactory = new MySessionFactory();
Session session = mySessionFactory.getSession();
SQLQuery sqlQuery = session.createSQLQuery("select * from student");
sqlQuery.addEntity(Student.class);
List<Student> list = new ArrayList<>();
list = sqlQuery.list();
for(Student student : list)
{
System.out.println(student.getName());
}
mySessionFactory.commit();
mySessionFactory.close();
}
}
其中用到了SQLQuery,这个类是Query的一个子类,通过Session来创建SQLQuery对象。
步骤为:
1.通过Hibernate获取Session对象
2.通过Session创建SQLQuery对象
3.编写sql语句
4.使用addScalar或addEntity等方法进行实体的查询、标量的添加、实体的关联等操作
如上面的代码所示
从hibernate中获得session对象
Session session = mySessionFactory.getSession();
为了方便,这里的mySessionFactory是前面写的工具类,看不懂的话建议翻一下前面的博客
接着,就是创建SQLQuery对象了
SQLQuery sqlQuery = session.createSQLQuery("select * from student");
sqlQuery.addEntity(Student.class);
第一行代码创建了一个SQLQuery对象,以及编写好的sql语句
第二行代码使用了addEntity方法进行实体查询,声明返回的数据类型
到这里使用SQL语句进行查询的方式就完成了
List<Student> list = new ArrayList<>();
list = sqlQuery.list();
for(Student student : list)
{
System.out.println(student.getName());
}
因为这里查询出来的数据不止一条,所以调用SQLQuery中的list方法将数据转为一个list集合,再进行输出
简化一下,可以将整个过程的代码写成如下形式
List<Student> list = session.createSQLQuery("select * from student")
.addEntity(Student.class)
.list();
for(Student student : list)
{
System.out.println(student.getName()+student.getAge());
}
上面使用了addEntity方法进行实体查询,当需要查询数据中的几个特定的列时,可以使用addScalar方法进行标量添加
List<Object[]> list = session.createSQLQuery("select * from student as s")
.addScalar("s.name")
.addScalar("s.sid")
.addScalar("s.age")
.list();
for(Object[] student : list)
{
System.out.println(Arrays.toString(student));
}
上面的代码中,使用了addScalar方法将name,sid,age这几个特定的列名进行标量添加,当输出student对象时,可以看到输出的数据中仅为这三个列的数据。
在使用SQLQuery时,我们可以采用命名查询的方式,将sql语句配置到xml文件中
例如这里新建一个SQLQuery.xml文件
配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<sql-query name="query_student01">
select s.* from student as s
<!-- 实体查询addEntity -->
<return alias="s" class="domain.Student"></return>
</sql-query>
<sql-query name="query_student02">
select s.* from student as s
<!-- 实体查询addEntity -->
<return alias="s" class="domain.Student"></return>
<!-- 标量查询addScalar -->
<return-scalar column="s.name"/>
</sql-query>
</hibernate-mapping>
这里定义了两个sql语句的配置,分别为query_student01,query_student02
先看一下第一个配置
<sql-query name="query_student01">
select s.* from student as s
<!-- 实体查询addEntity -->
<return alias="s" class="domain.Student"></return>
</sql-query>
其中第一行代码为sql语句,第二行的return语句为返回的类型,alias表示别名,class表示返回的实体名
配置完成后在代码中调用getNamedQuery方法来使用这个配置即可
List<Student> list = session.getNamedQuery("query_student01").list();
for(Student student : list)
{
System.out.println(student.getName());
}
第二个sql配置同样
<return-scalar column="s.name"/>
其中的return-scalar对应标量的添加,例如这里额外添加了name这个标量
同样的,在测试代码中调用这个配置
List<Object[]> list = session.getNamedQuery("query_student02").list();
for(Object[] student : list)
{
System.out.println(Arrays.toString(student));
}
上一篇: hibernate属性Set的排序
推荐阅读
-
持久层ORM框架Hibernate框架的使用及搭建方式
-
在Java的Hibernate框架中使用SQL语句的简单介绍
-
在Java的Hibernate框架中使用SQL语句的简单介绍
-
详解Java的Hibernate框架中的缓存与原生SQL语句的使用
-
Hibernate持久层框架使用【三】数据查询与删除
-
bbossgroups持久层框架动态sql语句配置和使用
-
Hibernate持久层框架使用【四】hibernate的常用注解
-
【Java开源框架】持久层框架mybatis之SQL语句构建器类及日志6
-
Java数据持久层框架 MyBatis之API学习七(动态 SQL详解)
-
Hibernate持久层框架使用【二】数据添加与修改