2016-11-07 38 views

回答

1

並非如此巧妙的方法,使用JPA標準建造

Path<String> col1Path=root.get("col1"); 
    Path<String> col2Path=root.get("col2"); 
    Path<String> col3Path=root.get("col3"); 

    Predicate p0=criteriaBuilder.concat(col1Path,col2Path,col3Path) 
     .in("col1Val1"||"col2Val1"||"col3Val1", 
       "col1Val2"|| "col2Val2"|| "col3Val2"); 

第二種方法

Path<String> col1Path=root.get("col1"); 
    Path<String> col2Path=root.get("col2"); 
    Path<String> col3Path=root.get("col3"); 

    Predicate p1=criteriaBuilder.or(
      criteriaBuilder.and(criteriaBuilder.equal(col1Path,"col1Val1"), 
           criteriaBuilder.equal(col2Path,"col2Val1"), 
           criteriaBuilder.equal(col3Path,"col3Val1") 
          ), 
      criteriaBuilder.and(criteriaBuilder.equal(col1Path,"col1Val2"), 
        criteriaBuilder.equal(col2Path,"col2Val2"), 
        criteriaBuilder.equal(col3Path,"col3Val2") 
        ) 
      ); 
+0

感謝您的回答!第一種方法可能會遇到不能唯一識別單個字符串的連接字符串問題(例如,列值「col1Val1col2」,「Val1col3」和「Val1」也將匹配)。第二種方法似乎更好 - 但在我的情況下會有一個非常大的值匹配列表,所以我想知道性能如何比較... –

+0

...剛剛找到了上述問題的答案(但遺憾的是不是我想要的聽到):http://stackoverflow.com/questions/782915#2481458 –

+0

通常情況下,IN子句是不高效的,特別是對於大型比較set.It似乎JPA不支持在元組中的where子句,我試圖找到確切的但我沒有成功,但無論如何,這個或那個解決方案的工作原理和性能幾乎與IN相同。如果你有大量的比較,也許你可以找到更多的一般條件 – Massimo