java - 具有 'like' 的 Hibernate findByExample 类似于示例中非空(字符串?)字段的行为

标签 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 映射到一个表 myobject,其中包含 namedescription 列,因此它看起来像这样

@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.likecrit 来实现我的字段中包含的值(如果不为 null 并且它支持 like 语句),但我宁愿不加思考地这样做。可能吗?

最佳答案

Hibernate 4 在通过示例查询 中支持“like” <strong>"%"</strong>

您只需要通过调用 .enableLike() 来启用该功能。在创建 Example example 时在您的 DAO findByExample 方法中。

示例代码(未经测试!):

findByExample 方法允许在generic DAO 实现中使用'like':

@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"); 也会匹配)

关于java - 具有 'like' 的 Hibernate findByExample 类似于示例中非空(字符串?)字段的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23777715/

相关文章:

java - 如何在 Eclipse 工作区中解决从一个 gradle 项目到另一 gradle 项目的依赖关系?

java - 为什么 ‘No database selected’ SQLException?

mysql - SQL女士2005 : Select a ID for a particular date where that date lies between fromdate and Todate

mysql : Check duplicate value of a column in 3 different tables

java - 使用多个参数过滤数据的最有效方法?

java - id 具有相同列名的对象的 ManyToMany 关系

java - 向 Chrome 同步服务发送 HTTPS 请求 - 收到错误 404

java - iBatis 是动态 SQL 查询的正确选择吗?

java - Spring 安全5 : There is no PasswordEncoder mapped for the id "null"

mysql - 有很多连接,有多少在C3P0.properties上设置