查询 <Tuple>Dsl 列表中的元组



假设我有一个包含很多列的猫的表。我正在尝试在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从List<CatProperties&gt)。>

根据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);
}

最新更新