在QueryDSL中使用CollectionExpression

Abh*_*kar 4 java querydsl

在QueryDSL库中,com.mysema.query.types.expr.SimpleExpression<T>该类有一个SimpleExpression.in(CollectionExpression<?, ? extends T>)方法,该方法应该采用一个应该返回集合的表达式.但是我找不到创建类型对象的方法com.mysema.query.types.CollectionExpression<?, ? extends T>.

我的查询表达式如下所示:

QEvent.event.organization.in(expression)
Run Code Online (Sandbox Code Playgroud)

在哪里我希望它expression是这样的:

QOrganization.organization.country.in("India", "USA")
Run Code Online (Sandbox Code Playgroud)

但第二个表达式是类型com.mysema.query.types.expr.BooleanExpression,我无法找到将其转换为的方法com.mysema.query.types.CollectionExpression<?, ? extends T>.

我查看了QueryDSL API文档但找不到任何相关内容.

Tim*_*per 11

您无法将BooleanExpression转换为CollectionExpression,原因与您无法将java.lang.Boolean转换为java.util.Collection的原因相同.它们不兼容.

以下表达对您来说意味着什么

QEvent.event.organization.in( 
    QOrganization.organization.country.in("India", "USA"))
Run Code Online (Sandbox Code Playgroud)

你可能试着表达这样的话吗?

QEvent event = QEvent.event;
QOrganization organization = QOrganization.organization;
query.from(event)
    .innerJoin(event.organization, organization)
    .where(organization.country.in("India", "USA"))
    .list(event);
Run Code Online (Sandbox Code Playgroud)

或者更简单

QEvent event = QEvent.event;
query.from(event)
    .where(event.organization.country.in("India", "USA"))
    .list(event);
Run Code Online (Sandbox Code Playgroud)

我想你试图描述的是使用子查询的表达式.像这样的东西

query.from(event)
    .where(event.organization.in( subQuery().from(organization)
        .where(organization.country.in("India", "USA")))
    .list(event);
Run Code Online (Sandbox Code Playgroud)

subQuery()的实现是特定于Querydsl后端的.如果您使用连接,那么每个匹配事件 - 组织组合和子查询都会获得一行,您将获得具有满足给定约束的组织的唯一事件.

连接与子查询的性能差异是特定于实现的.

您使用哪个Querydsl后端?JPA,SQL还是其他什么?