如何 select 子查询中的多列(hql)
how to select multiple columns in subquery(hql)
有没有办法在 hql 的子查询中 select 多列?
我想将以下 mysql 查询转换为 hql
select u.name, sub.cnt from user u
inner join (select user_id, count(user_id) cnt from user_log group by user_id order by cnt desc limit 5) sub
on u.id = sub.user_id;
但是在hql中,我知道只能在where子句中使用子查询
我不知道纯 Hibernate 解决方案。我在我的博客 post.
中谈到了这一点
但是您可以考虑使用 FluentJPA 解决方案:
FluentQuery query = FluentJPA.SQL((User u) -> {
UserIdCount sub = subQuery((UserLog log) -> {
int count = alias(COUNT(log.getUserId()), UserIdCount::getCount);
SELECT(log.getUserId(), count);
FROM(log);
ORDER(BY(count).DESC());
LIMIT(5);
});
SELECT(u.getName(), sub.getCount());
FROM(u).JOIN(sub).ON(u.getId() == sub.getUserId());
});
return query.createQuery(em, UserNameCount.class).getSingleResult();
产生以下 SQL:
SELECT t0.name, q0.count
FROM USER t0 INNER JOIN (SELECT t1.user_id, COUNT(t1.user_id) AS count
FROM USER_LOG t1
ORDER BY COUNT(t1.user_id) DESC
LIMIT 5 ) q0 ON (t0.id = q0.user_id)
我使用的实体(用 lombok 声明):
@Entity
@Getter
@Table(name = "USER")
class User {
private Long id;
private String name;
}
@Entity
@Getter
@Table(name = "USER_LOG")
class UserLog {
private Long userId;
}
@Tuple
@Getter
class UserIdCount {
private Long userId;
private int count;
}
@Tuple
@Data
class UserNameCount {
private int count;
private String name;
}
有没有办法在 hql 的子查询中 select 多列?
我想将以下 mysql 查询转换为 hql
select u.name, sub.cnt from user u
inner join (select user_id, count(user_id) cnt from user_log group by user_id order by cnt desc limit 5) sub
on u.id = sub.user_id;
但是在hql中,我知道只能在where子句中使用子查询
我不知道纯 Hibernate 解决方案。我在我的博客 post.
中谈到了这一点但是您可以考虑使用 FluentJPA 解决方案:
FluentQuery query = FluentJPA.SQL((User u) -> {
UserIdCount sub = subQuery((UserLog log) -> {
int count = alias(COUNT(log.getUserId()), UserIdCount::getCount);
SELECT(log.getUserId(), count);
FROM(log);
ORDER(BY(count).DESC());
LIMIT(5);
});
SELECT(u.getName(), sub.getCount());
FROM(u).JOIN(sub).ON(u.getId() == sub.getUserId());
});
return query.createQuery(em, UserNameCount.class).getSingleResult();
产生以下 SQL:
SELECT t0.name, q0.count
FROM USER t0 INNER JOIN (SELECT t1.user_id, COUNT(t1.user_id) AS count
FROM USER_LOG t1
ORDER BY COUNT(t1.user_id) DESC
LIMIT 5 ) q0 ON (t0.id = q0.user_id)
我使用的实体(用 lombok 声明):
@Entity
@Getter
@Table(name = "USER")
class User {
private Long id;
private String name;
}
@Entity
@Getter
@Table(name = "USER_LOG")
class UserLog {
private Long userId;
}
@Tuple
@Getter
class UserIdCount {
private Long userId;
private int count;
}
@Tuple
@Data
class UserNameCount {
private int count;
private String name;
}