多个Join使用相同的表QueryDSL hibernate

时间:2015-12-02 18:30:18

标签: sql hibernate querydsl

我遇到了QueryDSL 4.0.5和多个JOIN的问题。 我有两个班:

public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Column(nullable = false)
    private String username;
}

public class Ranking {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Column(nullable = false)
    private Date date;

    @Column(nullable = false)
    private Integer rank;

    @Column(nullable = false)
    private Integer point;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "seller_id")
    private Users user;
}

有些用户是卖家并且有排名。

我想要做的是获取每个用户,他的身份和姓名,以及他在2015-12-01 00:00:00的排名(由于我的项目肯定存在)和他在[{1}}的排名(可能是null) (日期是例如)

所以在SQL中(完全正常):

2015-12-01 00:00:00

但是当我想用queryDSL做这个请求时,它没有工作...... 这是我的代码: 我有两个SELECT u.id, u.username, r.rank, r2.rank FROM USERS u INNER JOIN ranking r ON u.id=r.seller_id AND r.date = '2015-12-01 00:00:00' LEFT OUTER JOIN ranking r2 ON u.id=r2.seller_id AND r2.date = '2015-10-28 00:00:00' ORDER BY r.rank ,因为多次加入相同的表格)

QRanking

这里提取日志:

private static final QSeller SELLER = QSeller.seller;
private static final QRanking RANKING = QRanking.ranking;
private static final QRanking RANKING_OLD = new QRanking("old");

queryFactory.from(SELLER)
.select(SELLER.id, SELLER.username, RANKING.point, RANKING.rank, RANKING_OLD.rank)
.innerJoin(RANKING.seller).on(RANKING.campaign.id.eq(campaignId).and(RANKING.date.eq(last)))
.leftJoin(RANKING_OLD.seller).on(RANKING_OLD.campaign.id.eq(campaignId).and(RANKINGY_OLD.date.eq(secondToLast)))
.orderBy(RANKING.rank.asc())
.fetch();

我该如何解决这个问题?

谢谢,

1 个答案:

答案 0 :(得分:4)

该异常告诉您"ranking.seller"是无效路径。此路径源自.innerJoin(RANKING.seller)。 Hibernate可能认为它无效,因为您要取消引用未在查询中定义的路径"ranking"(它不出现在from子句或任何前面的join子句中)。您可能希望改为编写.innerJoin(SELLER.ranking, RANKING)