Select Projections.constructor中的子查询

Yun*_*ium 5 mysql hibernate subquery querydsl

试图在Select子句中使用Project来编写子查询

queryFactory.query()
            .select(
                    Projections.constructor(
                            MemberPaymentDTO.class,
                            JPAExpressions
                                    .select(coopMember)
                                    .from(coopMember)
                                    .where(memberPayment.memberId.eq(coopMember))
                                    .fetchOne(),
                            JPAExpressions
                                    .select(paymentTransaction.amount)
                                    .from(paymentTransaction)
                                    .where(paymentTransaction.transactionId.eq(memberPayment.paymentTransaction.transactionId))
                                    .fetchOne().floatValue(),
                            JPAExpressions
                                    .select(collectionTransaction.price.multiply(collectionTransaction.quantity).sum())
                                    .from(collectionTransaction)
                                    .where(collectionTransaction.member.memberId.eq(memberPayment.memberId.memberId))
                                    .where(collectionTransaction.paymentPeriod.paymentPeriodId.eq(paymentPeriodId))
                                    .fetchOne().floatValue()

            )
            .from(memberPayment);   
Run Code Online (Sandbox Code Playgroud)

DTO如下

public class MemberPaymentDTO {
    private CoopMember coopMember;
    private float payableAmount;
    private float collectionsAmount;


    public MemberPaymentDTO(CoopMember coopMember, float payableAmount, float collectionsAmount) {
        this.coopMember = coopMember;
        this.payableAmount = payableAmount;
        this.collectionsAmount = collectionsAmount;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面代码的问题是Intellij Compiler抱怨 Cannot resolve method 'constructor(java.lang.Class<re.iprocu.model.MemberPaymentDTO>, re.iprocu.model.CoopMember, float, float)

是否可以将子查询添加到select子句并在DTO中设置?怎么样?

Már*_*des 1

我对 QueryDSL 不太熟悉,但错误非常具体。

没有构造函数需要两个浮点值,在您的情况下,它们来自:

JPAExpressions
                                    .select(paymentTransaction.amount)
                                    .from(paymentTransaction)
                                    .where(paymentTransaction.transactionId.eq(memberPayment.paymentTransaction.transactionId))
                                    .fetchOne().floatValue()
Run Code Online (Sandbox Code Playgroud)

和:

JPAExpressions
                                    .select(paymentTransaction.amount)
                                    .from(paymentTransaction)
                                    .where(paymentTransaction.transactionId.eq(memberPayment.paymentTransaction.transactionId))
                                    .fetchOne().floatValue()
Run Code Online (Sandbox Code Playgroud)

API http://www.querydsl.com/static/querydsl/4.0.5/apidocs/com/querydsl/core/types/Projections.html指出 Projections.constructor 的可能用途是:

constructor(Class<? extends T> type, Expression<?>... exprs)
Create a constructor invocation projection for the given type and expressions

constructor(Class<? extends T> type, Class<?>[] paramTypes, com.google.common.collect.ImmutableList<Expression<?>> exprs)
Create a constructor invocation projection for given type, parameter types and expressions

constructor(Class<? extends T> type, Class<?>[] paramTypes, Expression<?>... exprs)
Create a constructor invocation projection for given type, parameter types and expressions
Run Code Online (Sandbox Code Playgroud)

这意味着您没有正确拨打电话。仔细阅读文档并搜索示例,基本上您正在滥用 API。