多个加入相同的 table QueryDSL 休眠
Multiple Join with same table QueryDSL hibernate
我遇到了 QueryDSL 4.0.5 和多重连接的问题。
我有两个 class :
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;
}
部分用户是卖家,有排名。
我想要做的是为每个用户获取他的 ID 和姓名,以及他在 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 做这个请求时,它不起作用...
这是我的代码:
我有两个 QRanking
因为多个连接相同 table)
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'
我该如何解决这个问题?
谢谢,
异常告诉您 "ranking.seller"
是无效路径。此路径源自 .innerJoin(RANKING.seller)
。 Hibernate 可能认为它无效,因为您正在取消引用您尚未在查询中定义的路径 "ranking"
(它没有出现在 from 子句或任何前面的 join 子句中)。您可能需要改为 .innerJoin(SELLER.ranking, RANKING)
。
我遇到了 QueryDSL 4.0.5 和多重连接的问题。 我有两个 class :
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;
}
部分用户是卖家,有排名。
我想要做的是为每个用户获取他的 ID 和姓名,以及他在 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 做这个请求时,它不起作用...
这是我的代码:
我有两个 QRanking
因为多个连接相同 table)
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'
我该如何解决这个问题?
谢谢,
异常告诉您 "ranking.seller"
是无效路径。此路径源自 .innerJoin(RANKING.seller)
。 Hibernate 可能认为它无效,因为您正在取消引用您尚未在查询中定义的路径 "ranking"
(它没有出现在 from 子句或任何前面的 join 子句中)。您可能需要改为 .innerJoin(SELLER.ranking, RANKING)
。