我正在使用hibernate 4和Spring 3.正如长标题所说,我需要创建一个这样的方法
public list<MyObject> findByExample(MyObject exampleInstance){
Criteria crit = session.createCriteria(MyObject.class);
Example example = Example.create(exampleInstance);
crit.add(example);
return crit.list();
}
但是让Hibernate将该示例与带有like
语句的字段值进行比较。像findByLikeExample(MyObject exampleInstance)
示例:
MyObject映射到包含myobject
和name
列的表description
,因此它看起来像这样
@Entity
public class MyObject{
private String name;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
表myobject
包含两行
+--------------------------------------------+
|name | description |
+--------------------------------------------+
|test line | This is a test line |
|Second line | This is the second test line |
+--------------------------------------------+
我想要这段代码
MyObject exampleInstance= new MyObject();
exampleInstance.setName("line");
return findByLikeExample(exampleInstance);
返回表格中的所有行(两个不同的MyObject
实体)
重要说明:MyObject
在这种情况下可以是类型参数,因此我事先并不知道这些字段。
我知道可以通过在exampleInstance
的所有字段上循环(使用反射)并为Restriction.like
添加crit
来获取我的字段中包含的值(如果不是null,如果不是它支持一个类似的声明),但我宁愿这样做而不反思。有可能吗?
答案 0 :(得分:3)
"%"
您只需在DAO findByExample 方法中创建.enableLike()
时调用Example example
即可启用该功能。
示例代码(未测试!):
findByExample 方法,允许&#39;喜欢&#39;在通用DAO 实施中:
@Override
@Transactional(readOnly = true, propagation = Propagation.MANDATORY)
public List<E> findByExample(final E exampleEntity) {
final Example example = Example.create(exampleEntity).excludeZeroes().enableLike();
return this.session.createCriteria(this.domainClass).add(example).list();
}
服务层中的用法:
MyObject exampleInstance= new MyObject();
exampleInstance.setName("%line%");
Collection<MyObject> results = myObjectDao.findByExample(exampleInstance);
(在您的示例中exampleInstance.setName("%line");
也匹配)