扩展Hibernate的查询

开发 后端
本文讲解扩展Hibernate的查询。hibernate-conditions.jar包主要是扩展了hibernate的查询功能,该功能依赖于hibernate及hibernate相关包.

包名:hibernate-conditions.jar

主要是扩展了hibernate的查询功能,该功能依赖于hibernate及hibernate相关包.

主要扩展了将一个变量注释成一个查询条件的功能,把整个对象当成一个未知的查询条件,交给解析器去解析.核心是几个注释的使用.下面解释这几个注释.

1. AsCondition 把一个变量注释成一个条件,该注释有两个最主要的字段,propertyName和symbol其中propertyName是指定要查询的hibernate实体的字段. symbol指明查询的操作比较符,即"=","< ",">"等操作.还有几个比较次要的字段:  groupOrdinal 指定分组的序号,如果一个对象有多个查询条件,可以指定这些条件序号.可以在不要的查询过程中指定不同的查询序号.

 ignoreNull 是否忽略null值,默认是忽略.如果不忽略null值,则在条件解析过程中遇到该查询条件的值为空,则将该条件解析为 "propertyName" is null

inherit 是否查询父类,默认是不查询父类.

2. AsAlias 查询集合,对应Criteria.createAlias()方法.只是里面有一个ignoreEmpty字段不同,该字段指定是否忽略集合为空,如果不忽略集合为空,则当该值为null的时候,解析后的查询条件为:集合 is empty

3. DesignatedProperty 该注释是用在被注释的是一个类,并指定该类中的一个属性作为查询条件的值.

4. Conversion 用于条件值的数据类型的转换.如:被查询条件值为Integter而被注释的变量为String,这时候就可以使用该注释把数据类型从String转换为Integter.除了通用类型的数据的转换还可以数据的类型的转换,把数据转换的类型ConversionType指定为Custom,注意,如果该属性指定为Custom则需要给出customDataConversionType的类型,该类型必须是继承DataConversion接口.如果没有指定,则不能进行任何的数据转换.

Conversion里还有一个属性throwDataConversionException,该属性指定如果数据转换异常,是否抛出异常,如果抛出异常则当次的查询会终止.如果出现异常但不抛出,则会忽略该查询条件.

使用也很简单:

创建一个AnnotationConditionParser对象,调用该对象的parser(Object...unkownConditionObject)方法可以指定未知道的条件实体,该方法被了接收被注释过的实体外还可以接收原来hibernate的查询条件和字符串的查询条件,如果是字符串的查询条件必须符合Criteria的查询格式,否则在hibernate解析时会有查询的异常.

AnnotationConditionParser对象中的groupLimit(int groupLimit)方法用于限定查询的分组,如果指定的分组则只解析属于该组的条件.

具体执行对条件的解析操作是createCriteria(DetachedCriteria criteria)方法,该方法把所有的条件解析成DetachedCriteria 的查询条件.接下来就是对DetachedCriteria 的操作了.由于DetachedCriteria 对象是hibernate的对象,该对象的用法相信大家比我还熟悉. 我在这里就不再解释了.

具体例子(只作为例子讲解,无法直接运行):

  1. public class ConditionTest {  
  2. /**  
  3. * @param args  
  4. */ 
  5. public static void main(String[] args) {  
  6. ConditionTest test = new ConditionTest();  
  7. test.setName("my name");  
  8. test.setSize(10);  
  9. OtherClass other1 = new OtherClass();  
  10. other1.setName("name1");  
  11. test.setObjectCondition(other1);  
  12. OtherClass other2 = new OtherClass();  
  13. other2.setName("name1");  
  14. test.setOther(other2);  
  15. DetachedCriteria detachedCriteria = DetachedCriteria.forEntityName("UserEntity");  
  16. new AnnotationConditionParser()  
  17. //限定查询的分组  
  18. .groupLimit(1)  
  19. //设置查询的实体对象  
  20. .parser(test)  
  21. //执行查询并填充DetachedCriteria对象  
  22. .createCriteria(detachedCriteria);  
  23. // ...  
  24. // 执行detachedCriteria对象的数据查询操作  
  25. }  
  26. //最简单的用法  
  27. @AsCondition(propertyName="size")  
  28. private int size;  
  29. @AsCondition(propertyName="name", symbol=Symbol.LIKE)  
  30. private String name;  
  31. //指定对象里的一个属性作为查询的条件  
  32. @AsCondition(propertyName="name")  
  33. @DesignatedProperty(propertyName="name")  
  34. private OtherClass objectCondition;  
  35.  
  36. public int getSize() {  
  37. return size;  
  38. }  
  39. public void setSize(int size) {  
  40. this.size = size;  
  41. }  
  42. public String getName() {  
  43. return name;  
  44. }  
  45. public void setName(String name) {  
  46. this.name = name;  
  47. }  
  48. public OtherClass getObjectCondition() {  
  49. return objectCondition;  
  50. }  
  51. public void setObjectCondition(OtherClass objectCondition) {  
  52. this.objectCondition = objectCondition;  
  53. }  
  54. public OtherClass getOther() {  
  55. return other;  
  56. }  
  57. public void setOther(OtherClass other) {  
  58. this.other = other;  
  59. }  
  60. //使用数据类型的转换  
  61. @AsCondition(propertyName="datetime", symbol=Symbol.NE, ignoreNull=true)  
  62. @DesignatedProperty(propertyName="name")  
  63. @Conversion(dataConversion=ConversionType.Custom, customDataConversionType=CustomTypeConversion.class)  
  64. private OtherClass other;  
  65.  
  66. public static class OtherClass{  
  67. private String name;  
  68. public String getName() {  
  69. return name;  
  70. }  
  71. public void setName(String name) {  
  72. this.name = name;  
  73. }  
  74. }  
  75. public static class CustomTypeConversion implements DataConversion{  
  76. @Override 
  77. public Object doConversion(Object data) throws DataConversionException {  
  78. return Date.valueOf(data.toString());  
  79. }  
  80.  
  81. }  
  82. }  

【编辑推荐】

  1. Hibernate基础(2)
  2. Hibernate基础(1)
  3. 简单的Hibernate入门介绍
  4. 在Liferay中使用Hibernate
  5. Hibernate模糊查询参数化的问题
责任编辑:book05 来源: csdn
相关推荐

2009-09-23 09:16:25

Hibernate复合

2009-06-26 10:32:00

QBC查询Hibernate

2009-09-22 15:26:30

Hibernate多表

2009-06-17 14:17:40

Criteria条件查Hibernate

2009-09-22 08:39:59

Hibernate F

2009-06-17 08:47:00

Hibernate优化

2009-06-18 09:14:08

Hibernate H

2009-09-24 15:27:41

Hibernate查询

2009-09-29 16:29:40

Hibernate查询

2009-09-27 10:19:11

Hibernate命名

2009-06-18 09:47:50

2009-09-25 11:23:13

Hibernate S

2009-09-21 13:42:47

Hibernate查询

2009-06-25 16:45:31

Hibernate

2009-09-25 13:39:40

Hibernate属性

2009-06-18 13:58:06

Hibernate多表Hibernate

2009-09-22 11:24:07

Hibernate查询

2009-06-30 16:46:45

Criteria进阶查

2009-06-30 16:44:10

Criteria基本查

2009-09-24 10:35:10

Hibernate查询
点赞
收藏

51CTO技术栈公众号