Hibernate findByExample с поведением типа "как" по непустым (строковым?) Полям из примера

61
5

Я использую 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 и если оно поддерживает аналогичный оператор), но я ' скорее сделайте это без размышлений. Является ли это возможным?

спросил(а) 2014-05-21T11:20:00+04:00 6 лет, 9 месяцев назад
1
Решение
86

Hibernate 4 поддерживает "like" в Query By Example с "%"

Вам просто нужно включить функцию, вызвав .enableLike(), создав Example example в методе DAO findByExample.

Пример кода (не проверен!):

Метод findByExample, который позволяет "нравится" в общей реализации 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"); будет совпадать)

ответил(а) 2014-05-21T15:06:00+04:00 6 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема