【问题标题】:Using CollectionExpression in QueryDSL在 QueryDSL 中使用 CollectionExpression
【发布时间】:2011-08-18 12:35:12
【问题描述】:

在 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 docs,但找不到任何相关内容。

【问题讨论】:

  • QEvent中的organization是什么类型?

标签: java querydsl


【解决方案1】:

您无法将 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 还是其他?

【讨论】:

  • 我使用 JPA 作为 QueryDSL 后端。你是对的,我试图采用子查询方式。
【解决方案2】:

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

你必须use a SubQuery

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多