Hibernate 命名查询、本地SQL、自定义SQL

分手后的思念是犯贱 2023-10-17 09:39 91阅读 0赞

命名查询

使用HQL查询时,HQL代码分布在程序代码内,不利于维护,使用命名查询可以解决此问题。

  • 使用命名查询步骤

    1).修改相应的映射文件,添加如下代码

    1. <query name="testNamedQuery">
    2. <![CDATA[
    3. from Emp where empno >:empno
    4. ]]>
    5. </query>

    2).在程序中调用Session的getNameQuery()方法获取此映射文件HQL语句
    示例:

    1. public void method() {
    2. Session session = HibernateSessionFactory.getSession();
    3. //获取映射文件内的HQL语句
    4. Query query = session.getNamedQuery("testNamedQuery");
    5. //实例化一个Emp对象
    6. Emp emp = new Emp();
    7. emp.setEmpno(50);
    8. //将雇员信息作为查询条件组合到HQL语句中
    9. query.setProperties(emp);
    10. List<Emp> list = query.list();
    11. for(Emp e : list) {
    12. System.out.println(e.getEmpno() + " " + e.getEname());
    13. }
    14. HibernateSessionFactory.closeSession();
    15. }

本地SQL

当HQL语句满足不了查询需求时,可以使用SQL来查询

示例:

  1. /**
  2. * 使用SQL进行查询
  3. */
  4. public void method1() {
  5. Session session = HibernateSessionFactory.getSession();
  6. String sql = "select {e.*} from Emp e where e.empno >?";
  7. //addEntity是将别名和实体类联系在一起
  8. SQLQuery query = session.createSQLQuery(sql).addEntity("e", Emp.class);
  9. query.setInteger(0, 50);
  10. List<Emp> list = query.list();
  11. for(Emp emp : list) {
  12. System.out.println(emp.getEmpno() + " " + emp.getEname());
  13. }
  14. HibernateSessionFactory.closeSession();
  15. }
  • 命名SQL查询

    1).映射文件代码

    1. <sql-query name="testSqlQuery">
    2. <![CDATA[
    3. select {e.*} from Emp e where e.empno >?
    4. ]]>
    5. <return alias="e" class="com.bc.demo03.pojo.Emp"/>
    6. </sql-query>

    2).程序代码

    1. /**
    2. * 命名SQL查询
    3. */
    4. public void method2() {
    5. Session session = HibernateSessionFactory.getSession();
    6. //获取查询语句
    7. Query query = session.getNamedQuery("testSqlQuery");
    8. //添加参数
    9. query.setInteger(0, 20);
    10. //获取查询结果
    11. List<Emp> list = query.list();
    12. for(Emp emp : list) {
    13. System.out.println(emp.getEmpno() + " " + emp.getEname());
    14. }
    15. HibernateSessionFactory.closeSession();
    16. }

自定义SQL

在使用Session来执行save()、update()、delete()操作的时候会通过映射标记<sql-insert><sql-update><sql-delete>来重载Hibernate默认的语句,因此我们可以使用这些标记来让Hibernate加载我们自定义的SQL语句

  1. 1).实体类映射文件配置
  2. <hibernate-mapping>
  3. <class name="com.bc.demo03.pojo.Emp" table="emp" catalog="hibernate_data" lazy="true">
  4. <id name="empno" type="java.lang.Integer">
  5. <column name="EMPNO" />
  6. <generator class="identity"></generator>
  7. </id>
  8. <property name="ename" type="java.lang.String">
  9. <column name="ENAME" length="10" />
  10. </property>
  11. <!--因为自定义update语句不涉及此字段,必须设置update="false"-->
  12. <property name="job" type="java.lang.String" update="false">
  13. <column name="JOB" length="9" />
  14. </property>
  15. <!--因为自定义insert语句不涉及此字段,必须设置insert="false"-->
  16. <property name="mgr" type="java.lang.Integer" insert="false">
  17. <column name="MGR" />
  18. </property>
  19. <!--其余属性配置同理略-->
  20. <!--自定义SQL语句-->
  21. <sql-insert>
  22. <!--insertupdate没有涉及的字段要在字段配置上添加insert="false"-->
  23. insert into Emp (ename,job) values(?,?)
  24. </sql-insert>
  25. <sql-update>
  26. <!--insertupdate没有涉及的字段要在字段配置上添加update="false"-->
  27. update Emp set ename = ?,mgr = ? where empno = ?
  28. </sql-update>
  29. <sql-delete>
  30. <!--没有涉及的字段要在字段配置上添加delete="false"-->
  31. delete from Emp where empno = ?
  32. </sql-delete>
  33. </class>
  34. </hibernate-mapping>
  35. 程序代码
  36. <!--正常调用save() update() delete()就会调用自定义SQL,这里就不写了-->

发表评论

表情:
评论列表 (有 0 条评论,91人围观)

还没有评论,来说两句吧...

相关阅读

    相关 hibernatesql查询

    hibernate有的时候用起来貌似不是那么顺手,像sql查询在hibernate中就是一大缺陷,稍微复杂点的查询hibernate几乎做不到。这次整理了一些关于hiberna