2011-08-18 78 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