mem*_*und 5 java spring spring-data-jpa
Spring支持通过要查找的对象的示例创建查询。喜欢:
//if not setting the age, it will always look for age=0
Person p = new Person();
p.setLastName("Smith");
List<Person> foundPersons = personRepository.findAll(Example.of(p));
@Entity
public class Person {
private String firstName;
private String lastName;
private LocalDate dob;
private int age;
}
Run Code Online (Sandbox Code Playgroud)
问题:如果@Entity具有原始字段,则它们的默认值实际上将用于创建查询。上面的示例将导致:
SELECT * from persons where lastname := 'Smith' and age := 0
在我的示例中,我有一个age必须始终填充的数据库字段,因此不允许填充null。因此,实体具有原始int age字段。
当然,我现在可以将字段更改为Integer age,但是然后将字段标记为可选的可为null的属性,这是不正确的。
因此,如何跳过尚未设置的原语Example?
是的,您可以这样做:
Person p = new Person();
p.setLastName("Smith");
Example criteria = Example.create(p).setPropertySelector(
Example.NotNullOrZeroPropertySelector.INSTANCE
);
List<Person> foundPersons = session.createCriteria(Person.class).add(criteria).list();
Run Code Online (Sandbox Code Playgroud)
Example.NotNullOrZeroPropertySelector.INSTANCE是一个属性选择器,仅包含null非零和非零(如果为数字)的属性
UPD
以上是Hibernate org.hibernate.criterion.Example类的示例。因为org.springframework.data.domain.Example您可以通过手动指定以下字段的名称来忽略基本字段:
Person p = new Person();
p.setLastName("Smith");
ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age").withIgnoreNullValues();
Example criteria = Example.of(p, matcher);
List<Person> foundPersons = personRepository.findAll(criteria);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1233 次 |
| 最近记录: |