5

在 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)

我希望expression是这样的:

QOrganization.organization.country.in("India", "USA")

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

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

4

2 回答 2

12

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

下面的表达对你意味着什么

QEvent.event.organization.in( 
    QOrganization.organization.country.in("India", "USA"))

你可能会尝试表达这样的东西吗?

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

或者更简单

QEvent event = QEvent.event;
query.from(event)
    .where(event.organization.country.in("India", "USA"))
    .list(event);

我猜你试图描述的是一个使用子查询的表达式。像这样的东西

query.from(event)
    .where(event.organization.in( subQuery().from(organization)
        .where(organization.country.in("India", "USA")))
    .list(event);

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

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

您使用哪个 Querydsl 后端?JPA、SQL 还是其他?

于 2011-08-18T19:47:59.417 回答
1

我认为您不能那样做,无论如何,这在数据库方面没有意义。

您必须使用子查询

于 2011-08-18T13:32:09.020 回答