1

我正在尝试使用连接 2 个表进行动态 sql 投影。这里 visibleColumns 是逗号分隔的字符串(我想在 SQL 选择语句中显示的动态列)。

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 Bad Request 创建如下查询:

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

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

4

1 回答 1

2

这里有一些使用 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;
}

}

于 2021-06-11T13:13:26.693 回答