java - 按示例查询跳过原语?

标签 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;
}

问题:如果 @Entity 有原始字段,那么它们的默认值实际上将用于创建查询。上面的示例将导致:

从姓氏 := 'Smith' 和年龄 := 0 的人中选择 *

在我的示例中,我有一个数据库字段,其中 age 必须始终填写,因此不允许为 null。因此实体有一个原始的 int age 字段。

当然,我现在可以将该字段更改为 Integer age,但随后我将该字段标记为可选的可空属性,这是不正确的。

那么,我如何才能跳过未在 Example 上设置的基元?

Reference 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();

Example.NotNullOrZeroPropertySelector.INSTANCE 是一个属性选择器,它只包含非 null 和非零(如果是数字)的属性

更新

上面是 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);

关于java - 按示例查询跳过原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45505043/

相关文章:

java - 使用 Spring Data 预填充数据

java - Starter autoconfig bean 始终优先于自定义 autoconfig bean

java - 使用 Spring JDBC 连接数据库

java - 如何从所有链接的问题中获取选民名单

java - 如何从 Spring Boot jar 构建 Docker 镜像

spring - MVC Controller 测试和 spring-data-jpa EnableSpringDataWebSupport

java - CascadeType.ALL 和 "insertable = false, updatable = false"是否相互排除?

java - JPA查询注释和连接表

java - 我如何扭转这个计算?

java - XML - 将节点添加到文本节点的中间