JeeWeb 动态SQL/HQL操作

动态SQL/HQL

我们使用hibernate的时候,总是会苦恼,我们的SQL/HQL写入到JAVA代码中导致SQL/HQL很难维护,而且代码中SQL格式很难调节,并且没有继承等等,很多逻辑还需要JAVA代码去判断。说到这里,可能有些人会觉得,Hibernate通过SQL来指定需要查询的字段,会破坏了Hibernate开发的简洁性,但本人觉得,一切框架都是为功能服务,什么方便,我们程序员就使用什么,不然就不是我们在使用框架,而是框架在使用我们。
好了,动态SQL/HQL的语法,他的基础于是继承了Freemarker的语法。并扩展了include_sql、include_hql标签,用于公用的SQL片段的引用。

Mapper XML 文件

Mapper XML配置文件有几个要素:
mapper –XML配置文件根节点,其中namespace只是一个预留,目前没有特别的用处.
sql – 可被其他语句引用的可重用SQL语句块。
hql – 可被其他语句引用的可重用的HQL语句块。
sql-query – SQL查询语句
hql-query – HQL查询语句

 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE mapper SYSTEM "http://www.jeeweb.cn/dtd/dynamic-hibernate-statement-1.0.dtd">
  3. <mapper namespace="cn.jeeweb">
  4. <!-- SQL 片段 -->
  5. <sql id="userfield">
  6. <![CDATA[
  7. id,realname
  8. ]]>
  9. </sql>
  10. <!-- HQL 片段-->
  11. <hql id="userfield">
  12. <![CDATA[
  13. id,realname
  14. ]]>
  15. </hql>
  16. <!-- SQL查询 -->
  17. <sql-query id="sys">
  18. <![CDATA[
  19. select * from sys_user where id=?
  20. ]]>
  21. </sql-query>
  22. <!-- HQL查询 -->
  23. <hql-query id="notirication">
  24. <![CDATA[
  25. FROM OaNotificationEntity m WHERE m.title like :title
  26. ]]>
  27. </hql-query>
  28. </mapper>

Mapper XML 语法

动态SQL/HQL的语法,他的基础于是继承了Freemarker的语法。并扩展了include_sql、include_hql标签,用于公用的SQL片段的引用。这里重点介绍基本的集中,其他的语法可以参照Freemarker。

  1. 变量格式${expr}
     
    1. <sql-query id="sys">
    2. <![CDATA[
    3. select * from sys_user where id=${id}
    4. ]]>
    5. </sql-query>
  2. 判断if…elseif…else语句
    动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:
     
    1. <sql-query id="sys.user">
    2. <![CDATA[
    3. select * from sys_user where id=${id}
    4. <#if sex == '男'>
    5. and t.sex=1
    6. <#else>
    7. and t.sex=0
    8. </#if>
    9. ]]>
    10. </sql-query>
    我们通过判断sex等于男,设置性别1。
  3. 循环<#list productList as p></#list>
    动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如:

     
    1. <sql-query id="sys.user">
    2. <![CDATA[
    3. select * from sys_user where id in
    4. (<#list ids as id>
    5. '${id}'<#if !id_has_next>,</#if>
    6. </list>)
    7. ]]>
    8. </sql-query>

    list标签的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。

  4. sql引用
    refid 为Sql片段的ID

     
    1. <sql-query id="sys.user">
    2. <![CDATA[
    3. select<@include_sql refid="userfield" />from sys_user where id='${id}'
    4. ]]>
    5. </sql-query>
  5. hql代码段引用
    refid 为HQL片段的ID
     
    1. <hql-query id="sys.user">
    2. <![CDATA[
    3. select<@include_hql
    4. refid="userfield" />from sys_user where id='${id}'
    5. ]]>
    6. </hql-query>
  6. 程序调用。
    动态SQL,我们采用ID查找方法来过来SQL判断,或者直接查询列表等等。
    在项目中,我们可以使用

     
    1. @Autowired
    2. private IDynamicHibernateAdapter dynamicHibernateAdapter,(一般不建设这样只用);

    初始化dynamicHibernateAdapter,通过Adapter中丰富的方法来执行自己想要的操作。

     
    1. int updateByHqlQueryId(final String queryId, final Object... params);
    2.  
    3. int updateByAliasHqlQueryId(final String queryId, final Map<String, Object> alias);
    4.  
    5. Long countByHqlQueryId(final String queryId, final Object... params);
    6.  
    7. Long countByAliasHqlQueryId(final String queryId, final Map<String, Object> alias);
    8.  
    9. <T> List<T> listByHqlQueryId(final String queryId, final Object... params);
    10.  
    11. <T> List<T> listByAliasHqlQueryId(final String queryId, final Map<String, Object> alias);
    12.  
    13. <T> List<T> listByHqlQueryId(final String queryId, int page, int rows, final Object... params);
    14.  
    15. List<Map<String, Object>> listMapByHqlQueryId(final String queryId, final Object... params);
    16.  
    17. List<Map<String, Object>> listMapByHqlQueryId(final String queryId,int page, int rows, final Object... params);
    18.  
    19. List<Map<String, Object>> listMapByAliasHqlQueryId(final String queryId, final Map<String, Object> alias);
    20.  
    21. List<Map<String, Object>> listMapByAliasHqlQueryId(final String queryId, int page, int rows,final Map<String, Object> alias);
    22.  
    23. void executeSqlQueryId(String queryId, final Object... params);
    24.  
    25. Integer countBySqlQueryId(String queryId, final Object... params);
    26.  
    27. List<Map<String, Object>> listBySqlQueryId(String queryId, final Object... params);
    28.  
    29. List<Map<String, Object>> listByAliasSqlQueryId(String queryId, final Map<String, Object> alias);
    30.  
    31. List<Map<String, Object>> listPageBySqlQueryId(String queryId, int page, int rows, final Object... params);
    32.  
    33. List<Map<String, Object>> listPageByAliasSqlQueryId(String queryId, int page, int rows,
    34. final Map<String, Object> alias);
    35.  
    36. <T> List<T> listEntityBySqlQueryId(String queryId, Class<T> entityClass, final Object... params);
    37.  
    38. <T> List<T> listEntityByAliasSqlQueryId(String queryId, Class<T> entityClass, final Map<String, Object> alias);
    39.  
    40. <T> List<T> listPageEntityBySqlQueryId(String queryId, int page, int rows, Class<T> entityClass,
    41. final Object... params);
    42.  
    43. <T> List<T> listPageEntityByAliasSqlQueryId(String queryId, int page, int rows, Class<T> entityClass,
    44. final Map<String, Object> alias);

    我们也可以使用Service类的类似方法来执行操作。

     
    1. @Autowired
    2. private IUserService userService;

    查询列表

     
    1. Map<String, Object> data = new HashMap<String, Object>();
    2. data.put("id", "40288ab85ce3c20a015ce3ca6df60000");
    3. List<Map<String, Object>> dataList = userService.listByAliasSqlQueryId("sys.user", data);

    方法:listByAliasSqlQueryId(String queryid,final Map alias);第一个参数对应xml中的ID,第二个参数对应xml中的数据,必须一Map方式传入。

    说明:
    虽然动态Sql提供了丰富的方法,但是可以通过方法的命名规则就可以识别,(返回数据)+[请求数据的类型]+(类型ID)。如:listByAliasSqlQueryId,及通过SQL别名查询方式获取数据列表。这里SqlQueryId,默认返回List,如果需要返回Entity类行,则使用listPageEntityBySqlQueryId。Hql方式则反之。

转载于:https://my.oschina.net/u/3371227/blog/1186641

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值