QueryDSL中具有多个联接的动态SQL投影



我尝试使用join2表进行动态sql投影。这里的visibleColumns是逗号分隔的字符串(我想在SQL select语句中显示的动态列(。

QActive qActive = QActive.active;.
QCustomer qCustomer = QCustomer.customer;
QBaseCounterParty qBaseCounterParty = QBaseCounterParty.baseCounterParty;
StringExpression path = Expressions.stringPath(qActive, visibleColumns);
return JPQLQuery<String> resultSet = query.select(path).from(qActive).innerJoin(qActive.customer, qCustomer).on(qInvoice.customer.id.eq(qCustomer.id))
.innerJoin(qBaseCounterParty).on(qCustomer.id.eq(qBaseCounterParty.id)).where(queryDslSpec).orderBy(sort)
.offset(request.getPagination().getStartRow()).limit(request.getPagination().getRowsPerPage());

因此,每当我试图运行它时,它都会创建如下查询:400错误请求:

select active.docNumber, customerName from Active active inner join Customer customer with active.id = customer.id inner join BaseCounterParty baseCounterParty with customer.id = baseCounterParty.id order by active.transactionDate desc

我不知道如何从其他表中选择列,因为列完全是动态的。

这里有一些使用QueryDSL构造函数投影的例子,可以用任何dto填充数据。警告dto构造函数必须具有相同的参数类型等。

QActive qActive = QActive.active;.
QCustomer qCustomer = QCustomer.customer;
QBaseCounterParty qBaseCounterParty = QBaseCounterParty.baseCounterParty;
return JPQLQuery<SomeDTO> resultSet =  query.select(Projections.constructor(SomeDTO.class, 
qActive.someValue1,
qBaseCounterParty.someValue2,
qActive.someValue3))
.from(qActive)
.innerJoin(qActive.customer, qCustomer).on(qInvoice.customer.id.eq(qCustomer.id))
.innerJoin(qBaseCounterParty).on(qCustomer.id.eq(qBaseCounterParty.id))
.where(queryDslSpec)
.orderBy(sort)
.offset(request.getPagination().getStartRow()).limit(request.getPagination().getRowsPerPage());
public class SomeDTO {
// QueryDSL Constructor
public SomeDTO(String value1, int value2, String value3) {
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
}

}

最新更新