2015-12-02 2 views
1

У меня возникла проблема с QueryDSL 4.0.5 и несколькими JOIN. Я два класса:Несколько Присоединиться к одной таблице QueryDSL hibernate

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 (которые существуют наверняка из-за мой проект) и его ранга в 2015-12-01 00:00:00 (который может быть пустым) (дата предназначены для, например)

Таким образом, в SQL (которые работают прекрасно):

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 

Но когда я хочу сделать этот запрос с queryDSL, это не работает ... Вот мой код: Я ve два QRanking из-за множественного соединения с тем же ta BLE)

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(); 

А вот выдержка из бревен:

org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'ranking.seller' 

org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'ranking.point' 

org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'ranking.rank' 

org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'old.rank' 

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'ranking.seller' 

Как я могу решить эту проблему?

Спасибо,

ответ

3

Исключение говорит вам, что "ranking.seller" является неверным путем. Этот путь происходит от .innerJoin(RANKING.seller). Hibernate, вероятно, считает его недействительным, поскольку вы разыскиваете путь "ranking", который вы не определили в своем запросе (он не отображается в предложении from или в предложении предшествующего соединения). Вероятно, вы захотите написать .innerJoin(SELLER.ranking, RANKING).

Смежные вопросы