2011-08-18 297 views
4

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

我的查询表达式如下:

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但找不到任何相关的东西。

+0

QEvent中'organization'的类型是什么? – ponzao

回答

11

您不能转换成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); 

子查询()的实现是Querydsl后端特定的。如果您使用连接,那么您会针对每个匹配事件(组织组合)和子查询获得一行,获得具有符合给定约束条件的组织的唯一事件。

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

您使用哪个Querydsl后端? JPA,SQL或其他东西?

+0

我正在使用JPA作为QueryDSL后端。你是对的,我试图去探索子查询的方式。 –

1

我不认为你可以这样做,无论如何,它在数据库方面是没有意义的。

你必须use a SubQuery