一直以来我都没有用过Hibernate的findByExample()
方法,前几天有一个见得的搜索功能需要实现。于是我想着测试一下该方法(懒得写SQL)。了解一下机制。
ZcDO zcDO = new ZcDO()
zcDO.setZcmc("投影仪")
zcDao.findByExample(zcDO)
在终端输出结果:
select ... from ... where (this_.NUM=? and this_.PRICE=? this_.ZCMC=? )
这里有问题,我明明只赋值了zcmc
,为什么搜索条件奇怪的加入了“为空”的两个属性。不是说好的会忽视null
属性吗?然后我看了一下ZcDO
类。
...
private int num;
private double price;
...
问题出在这,这两个属性的类型都是Java中的基本数据类型,如果么有初始化,就会被赋值默认值。
byte | 0 |
int | 0 |
long | 0L |
char | ‘u0000’ |
float | 0.0f |
double | 0 |
boolean | false |
所有引用类型 | null |
那怎么办?难道得自己写sql语句来查询吗?不不不,有一个解决办法,那就是包装类
byte | Byte | |
boolean | Boolean | |
short | Short | |
char | Character | |
int | Integer | |
long | Long | |
float | Float | |
double | Double |
包装类是类,为了弥补基本数据类型不能面向对象。这些类的用途主要包含两种:
作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
对象引用的默认值是什么来着,对,null
,说了那么多废话解决问题的根本就在这。把zcDO类中基本数据类型的属性改成包装类。
...
private Integer num;
private Double price;
...
再次执行findByExample()
方法。终端输出:
select ... from ... where (this_.ZCMC=? )
最后总结一下findByExample()
方法:
- 不支持主键
- 不支持关联
- 不支持NULL