命名查询
使用HQL查询时,HQL代码分布在程序代码内,不利于维护,使用命名查询可以解决此问题。
- 使用命名查询步骤
1).修改相应的映射文件,添加如下代码
<hibernate-mapping>
<query name="testNamedQuery">
<![CDATA[
from Emp where empno >:empno
]]>
</query>
</hibernate-mapping>
2).在程序中调用Session的getNameQuery()方法获取此映射文件HQL语句
示例:
public void method() {
Session session = HibernateSessionFactory.getSession();
//获取映射文件内的HQL语句
Query query = session.getNamedQuery("testNamedQuery");
//实例化一个Emp对象
Emp emp = new Emp();
emp.setEmpno(50);
//将雇员信息作为查询条件组合到HQL语句中
query.setProperties(emp);
List<Emp> list = query.list();
for(Emp e : list) {
System.out.println(e.getEmpno() + " " + e.getEname());
}
HibernateSessionFactory.closeSession();
}
本地SQL
当HQL语句满足不了查询需求时,可以使用SQL来查询
示例:
/**
* 使用SQL进行查询
*/
public void method1() {
Session session = HibernateSessionFactory.getSession();
String sql = "select {e.*} from Emp e where e.empno >?";
//addEntity是将别名和实体类联系在一起
SQLQuery query = session.createSQLQuery(sql).addEntity("e", Emp.class);
query.setInteger(0, 50);
List<Emp> list = query.list();
for(Emp emp : list) {
System.out.println(emp.getEmpno() + " " + emp.getEname());
}
HibernateSessionFactory.closeSession();
}
- 命名SQL查询
1).映射文件代码
<hibernate-mapping>
<sql-query name="testSqlQuery">
<![CDATA[
select {e.*} from Emp e where e.empno >?
]]>
<return alias="e" class="com.bc.demo03.pojo.Emp"/>
</sql-query>
</hibernate-mapping>
2).程序代码
/**
* 命名SQL查询
*/
public void method2() {
Session session = HibernateSessionFactory.getSession();
//获取查询语句
Query query = session.getNamedQuery("testSqlQuery");
//添加参数
query.setInteger(0, 20);
//获取查询结果
List<Emp> list = query.list();
for(Emp emp : list) {
System.out.println(emp.getEmpno() + " " + emp.getEname());
}
HibernateSessionFactory.closeSession();
}
自定义SQL
在使用Session来执行save()、update()、delete()操作的时候会通过映射标记<sql-insert><sql-update><sql-delete>
来重载Hibernate默认的语句,因此我们可以使用这些标记来让Hibernate加载我们自定义的SQL语句
1).实体类映射文件配置
<hibernate-mapping>
<class name="com.bc.demo03.pojo.Emp" table="emp" catalog="hibernate_data" lazy="true">
<id name="empno" type="java.lang.Integer">
<column name="EMPNO" />
<generator class="identity"></generator>
</id>
<property name="ename" type="java.lang.String">
<column name="ENAME" length="10" />
</property>
<!--因为自定义update语句不涉及此字段,必须设置update="false"-->
<property name="job" type="java.lang.String" update="false">
<column name="JOB" length="9" />
</property>
<!--因为自定义insert语句不涉及此字段,必须设置insert="false"-->
<property name="mgr" type="java.lang.Integer" insert="false">
<column name="MGR" />
</property>
<!--其余属性配置同理略-->
<!--自定义SQL语句-->
<sql-insert>
<!--insert和update没有涉及的字段要在字段配置上添加insert="false"-->
insert into Emp (ename,job) values(?,?)
</sql-insert>
<sql-update>
<!--insert和update没有涉及的字段要在字段配置上添加update="false"-->
update Emp set ename = ?,mgr = ? where empno = ?
</sql-update>
<sql-delete>
<!--没有涉及的字段要在字段配置上添加delete="false"-->
delete from Emp where empno = ?
</sql-delete>
</class>
</hibernate-mapping>
程序代码
<!--正常调用save() update() delete()就会调用自定义SQL,这里就不写了-->