2017-08-04 67 views
0

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具有原始字段,然后它们的默认值实际上将用于创建查询。上面的例子将导致:

SELECT * from persons where lastname := 'Smith' and age := 0

在我的例子我有一个数据库字段,其中age必须充满,这样是不允许被null。因此该实体具有原始int age字段。

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

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

Reference Example

+0

我会使用整数方法。如果你对年龄有限制,我认为不会有任何问题。 –

回答

2

是的,你可以做到这一点:

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和非零值(如数字)的属性

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); 
+0

关于像'short,byte,boolean'这样的基元怎么样? – membersound

+1

'Short'和'Byte'也是数字类型,所以它们将被忽略。无论如何,你可以为布尔类型和数值类型编写自己的'PropertySelector'实现 –

+1

@membersound我真的很抱歉,因为我困惑了2个类,所以我更新了我的答案 –