並非如此巧妙的方法,使用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")
)
);
感謝您的回答!第一種方法可能會遇到不能唯一識別單個字符串的連接字符串問題(例如,列值「col1Val1col2」,「Val1col3」和「Val1」也將匹配)。第二種方法似乎更好 - 但在我的情況下會有一個非常大的值匹配列表,所以我想知道性能如何比較... –
...剛剛找到了上述問題的答案(但遺憾的是不是我想要的聽到):http://stackoverflow.com/questions/782915#2481458 –
通常情況下,IN子句是不高效的,特別是對於大型比較set.It似乎JPA不支持在元組中的where子句,我試圖找到確切的但我沒有成功,但無論如何,這個或那個解決方案的工作原理和性能幾乎與IN相同。如果你有大量的比較,也許你可以找到更多的一般條件 – Massimo