通过示例查询跳过原语?

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

参考例

Myk*_*nko 5

是的,您可以这样做:

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)