2017-08-04 89 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個類,所以我更新了我的答案 –