假设我有一个包含很多列的猫的表。我正在尝试在QueryDsl:
中执行此查询的等效操作。select * from cat where (cat.pattern, cat.breed) in (('calico', 'Siberian'), ('grey', 'Siamese'), ('tabby', 'Maine Coon'));
在Java中,我有这样一个类来参数化我的猫:
class CatParameters {
public String pattern;
public String breed;
}
和这个方法(不幸的是不正确的)从数据库中获取猫:
public List<CatDto> getCatsByParameters(List<CatParameters> params) {
// something like this
QCat cat = QCat.cat;
return query.from(cat)
.where(Expressions.list(cat.pattern, cat.breed).in(params))
.list(ConstructorExpression.create(CatDto.class, cat.field1, cat.field2, cat.field3, .../* etc */))
}
这显然会导致错误"Cannot resolve method 'in(java.util.List<my.package.name.Cat>)'"
.
那么我怎么能查询一些猫(colX, colY)是在java对象的列表与这些属性?
UPD:我发现这个问题与子查询而不是集合相当相似,但我想知道是否有一种方法可以用集合来做到这一点(或者可能以某种方式创建List
根据QueryDSL的维护者,使用CollectionExpression
或嵌套的Expression.list
都不是正确的方法,而是需要使用Template
表达式(正如在这个问题的评论中所暗示的那样)。下面是它的样子:
public List<CatDto> getCatsByParameters(List<CatParameters> params) {
QCat cat = QCat.cat;
return query.from(cat)
.where(Expressions.list(cat.pattern, cat.breed).in(Expressions.list(
params.stream()
.map(catParam -> makeTuple(
Expressions.constant(catParam.pattern), Expressions.constant(catParam.breed)))
.toArray(new Expression[0])
)))
.list(ConstructorExpression.create(CatDto.class, cat.field1, cat.field2, cat.field3, .../* etc */))
}
private static SimpleExpression<Object> makeTuple(Expression<?>... args) {
return Expressions.template(Object.class, "({0}, {1})", (Object[]) args);
}