This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Combine Specs

    在 POJO 中, 可以使用 @And@Or 來組合一個物件中的多個 Specification, 組合的預設是 @And.

    Combine on Classes

    @And@Or 可以宣告在 Class 上, 例如:

    @Or // 若沒定義預設就是 @And
    @Data
    public class CustomerCriteria {
    
      @Spec(Like.class)
      String firstname;
      
      @Spec(Like.class)
      String lastname;
    }
    

    執行的 SQL 會類似:

    ... where x.firstname like %?% or x.lastname like %?% 
    

    Combine on Fields

    你也可以將 @And@Or 註記在欄位上來控制單獨一個欄位要怎麼跟其他欄位組合. 舉個例子如下:

    @Data
    public class CustomerCriteria {
    
      @Spec(Like.class)
      String firstname;
      
      @Spec(Like.class)
      String lastname;
    
      @Or
      @Spec(value = After.class, not = true)
      LocalDate birthday;
    }
    

    執行的 SQL 會類似:

    ... where (x.firstname like ?) and (x.lastname like ?) or x.birthday<=?
    

    例如, 將上面的例子調整欄位順序:

    @Data
    public class CustomerCriteria {
    
      @Spec(Like.class)
      String firstname;
      
      @Or
      @Spec(value = After.class, not = true)
      LocalDate birthday;
      
      @Spec(Like.class)
      String lastname;
    }
    

    執行的 SQL 會類似:

    ... where (x.firstname like ? or x.birthday<=?) and (x.lastname like ?)