【问题标题】:HQL Select in Join StatementJoin 语句中的 HQL 选择
【发布时间】:2017-08-12 08:31:19
【问题描述】:

我正在尝试创建 HQL 查询,该查询连同其他详细信息也从其他表中选择聚合。预期结果如下:

member, collectionAmount, deductionAmount, saleAmount, prePaymentAmount
------------------------------------------------------------------------
<m>   ,    250          ,  550           ,   1500    ,    4550

虽然已经编写了以下查询

        "SELECT ctJoin.totalCollection, stJoin.saleAmount, dtJoin.deductionAmount, pJoin.prePaymentAmount, mp.amount, mp.memberId " +
        "FROM MemberPayment mp " +
        "LEFT JOIN ( " +
            "SELECT SUM(ct.price * ct.quantity) AS totalCollection , ct.member.memberId AS memberId  " +
            "FROM CollectionTransaction ct " +
            "WHERE ct.paymentPeriod.paymentPeriodId = ?1 AND ct.voided = false " +
            "GROUP BY ct.member.memberId) AS ctJoin ON mp.memberId.memberId = ctJoin.memberId " +
        "LEFT JOIN ( " +
            "SELECT SUM(st.saleAmount) AS saleAmount, st.memberId.memberId AS memberId " +
            "FROM SaleTransaction st " +
            "WHERE st.paymentPeriod = ?1 AND st.voided = false " +
            "GROUP BY st.memberId.memberId) AS stJoin ON stJoin.memberId = mp.memberId.memberId "+
        "LEFT JOIN ( " +
            "SELECT SUM(dt.amount) AS deductionAmount, dt.memberId.memberId AS memberId " +
            "FROM DeductionTransaction dt " +
            "WHERE dt.paymentPeriod = ?1 AND dt.voided = false " +
            "GROUP BY dt.memberId.memberId ) AS dtJoin ON dtJoin.memberId = mp.memberId.memberId "+
        "LEFT JOIN ( " +
            "SELECT SUM(p.paymentTransaction.amount) AS prePaymentAmount, p.memberId.memberId AS memberId " +
            "FROM MemberPayment p " +
            "WHERE p.paymentPeriodId = ?1 AND p.voided = false AND p.paymentTransaction.paymentType.id = 7 " +
            "GROUP BY p.memberId.memberId ) AS pJoin ON pJoin.memberId = mp.memberId.memberId "+
        "WHERE mp.memberId.memberId IN (?2)"

Intellij 在运行时抛出此错误:

org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:86) ~[spring-data-jpa-1.10.3.RELEASE.jar:na]
... 69 common frames omitted
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 170 [SELECT ctJoin.totalCollection, stJoin.saleAmount, dtJoin.deductionAmount, pJoin.prePaymentAmount, mp.amount, mp.memberId FROM re.iprocu.model.MemberPayment mp LEFT JOIN ( SELECT SUM(ct.price * ct.quantity) AS totalCollection , ct.member.memberId AS memberId  FROM re.iprocu.model.CollectionTransaction ct WHERE ct.paymentPeriod.paymentPeriodId = ?1 AND ct.voided = false GROUP BY ct.member.memberId) AS ctJoin ON mp.memberId.memberId = ctJoin.memberId LEFT JOIN ( SELECT SUM(st.saleAmount) AS saleAmount, st.memberId.memberId AS memberId FROM re.iprocu.model.SaleTransaction st WHERE st.paymentPeriod = ?1 AND st.voided = false GROUP BY st.memberId.memberId) AS stJoin ON stJoin.memberId = mp.memberId.memberId LEFT JOIN ( SELECT SUM(dt.amount) AS deductionAmount, dt.memberId.memberId AS memberId FROM re.iprocu.model.DeductionTransaction dt WHERE dt.paymentPeriod = ?1 AND dt.voided = false GROUP BY dt.memberId.memberId ) AS dtJoin ON dtJoin.memberId = mp.memberId.memberId LEFT JOIN ( SELECT SUM(p.paymentTransaction.amount) AS prePaymentAmount, p.memberId.memberId AS memberId FROM re.iprocu.model.MemberPayment p WHERE p.paymentPeriodId = ?1 AND p.voided = false AND p.paymentTransaction.paymentType.id = 7 GROUP BY p.memberId.memberId ) AS pJoin ON pJoin.memberId = mp.memberId.memberId WHERE mp.memberId.memberId IN (?2)]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:288) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1894) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
... 76 common frames omitted

问题

如何使用 HQL、HPQL、QueryDSL 或 SpringDataJPA 激活预期结果?

更新

会员支付模式

public class MemberPayment extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "payment_id")
    private Integer paymentId;
    @JoinColumn(name = "member_id", referencedColumnName = "member_id")
    @ManyToOne(optional = false)
    private CoopMember memberId;

    @Column(name = "paymentperiod_id")
    private Integer paymentPeriodId;

    @JoinColumn(name = "payment_transaction")
    @OneToOne(cascade = CascadeType.ALL)
    private PaymentTransaction paymentTransaction;
}

CollectionTransactionDeductionTransactionSaleTransaction都有一个

@JoinColumn(name = "member_id", referencedColumnName = "member_id")
@ManyToOne(optional = false)
private CoopMember memberId;

【问题讨论】:

    标签: spring hibernate spring-data-jpa querydsl


    【解决方案1】:

    在没有看到模型的情况下很难构建 SQL 语句。但我试过了))

    select 
        m as member, 
        sum(ct.price * ct.quantity) as collectionAmount, 
        sum(dt.amount) as deductionAmount, 
        sum(st.saleAmount) as saleAmount, 
        sum(pt.amount) as prePaymentAmount
    from 
        MemberPayment mp
        left join mp.collectionTransaction ct
        left join mp.saleTransaction st
        left join mp.deductionTransaction dt
        left join mp.paymentTransaction pt
        join pt.paymentType type
        join mp.memberId m
    where
        ct.paymentPeriod = ?1 and ct.voided = false and 
        st.paymentPeriod = ?1 and st.voided = false and
        dt.paymentPeriod = ?1 and dt.voided = false and
        mp.paymentPeriod = ?1 and mp.voided = false and type.id = 7 and
        m.memberId in ?2
    group by
        m
    

    更新

    select 
        m as member, 
        sum(ct.price * ct.quantity) as collectionAmount, 
        sum(dt.amount) as deductionAmount, 
        sum(st.saleAmount) as saleAmount, 
        sum(pt.amount) as prePaymentAmount  
    from 
        MemberPayment mp, CollectionTransaction ct, DeductionTransaction dt, SaleTransaction st
        join mp.memberId m
        join mp.paymentTransaction pt
    where 
        mp.paymentPeriodId = ?1 and
        m.memberId in ?2 and 
        ct.memberId = m and ct.paymentPeriodId = mp.paymentPeriodId and
        dt.memberId = m and dt.paymentPeriodId = mp.paymentPeriodId and
        st.memberId = m and st.paymentPeriodId = mp.paymentPeriodId 
    group by
        m
    

    【讨论】:

    • MemberPayment 模型不包含 collectionTransaction、saleTransaction、deductionTransaction 或 paymentTransaction。所有这 5 个模型(MemberPayment、CollectionTransaction、SaleTransaction、DeductionTransaction 和 PaymentTransaction)都有共同的 memberId
    • 加上你的连接不包含 ON 子句来显示连接点
    • 刚刚更新并展示了我的MemberPayment 模型,其他模型只有成员和相应的数量。从显示的HPQL(不是您所说的 SQL)中,唯一需要的是每个 memer 的总量
    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多