Hibernate findByExample with' like' like like on not null(string?)field from the example

时间:2014-05-21 08:20:24

标签: java sql spring hibernate

我正在使用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映射到包含myobjectname列的表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,如果不是它支持一个类似的声明),但我宁愿这样做而不反思。有可能吗?

1 个答案:

答案 0 :(得分:3)

Hibernate 4支持&#39;喜欢&#39;在按示例查询"%"

您只需在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");也匹配)