QueryDSL JPA- 与 group by 无关的自连接
QueryDSL JPA- Self join without relationship with group by
有什么方法可以使用 QueryDSL 获取此查询吗?
select
person.name,
count(neighbors.*)
from person as neighbors
where person.address = neighbor.address
group by person.name
其中 address
不是 FK。
第一个问题的关键是使用别名来进行自连接:
// static instance uses default alias "person"
QPerson person = QPerson.person;
QPerson neighbor = new QPerson("neighbor");
JPAQuery query = new JPAQuery(em)
.from(person, neighbor)
.where(person.adress.eq(neighbor.adress))
.groupBy(person.name);
要获得结果,您只需使用元组 class:
List<Tuple> results = query.list(person.name, neighbor.count());
for (Tuple row : result) {
System.out.println("name: " + row.get(person.name));
System.out.println("count: " + row.get(neighbor.count()));
}
或者您可以使用 ConstructorExpression
来做这样的事情:
List<MyResult> results = query.list(ConstructorExpression.create(
MyResult.class, person.name, neighbor.count()));
public class MyResult {
private String name;
private long count;
public MyResult(String name, long count) {
this.name = name;
this.count = count;
}
}
有什么方法可以使用 QueryDSL 获取此查询吗?
select
person.name,
count(neighbors.*)
from person as neighbors
where person.address = neighbor.address
group by person.name
其中 address
不是 FK。
第一个问题的关键是使用别名来进行自连接:
// static instance uses default alias "person"
QPerson person = QPerson.person;
QPerson neighbor = new QPerson("neighbor");
JPAQuery query = new JPAQuery(em)
.from(person, neighbor)
.where(person.adress.eq(neighbor.adress))
.groupBy(person.name);
要获得结果,您只需使用元组 class:
List<Tuple> results = query.list(person.name, neighbor.count());
for (Tuple row : result) {
System.out.println("name: " + row.get(person.name));
System.out.println("count: " + row.get(neighbor.count()));
}
或者您可以使用 ConstructorExpression
来做这样的事情:
List<MyResult> results = query.list(ConstructorExpression.create(
MyResult.class, person.name, neighbor.count()));
public class MyResult {
private String name;
private long count;
public MyResult(String name, long count) {
this.name = name;
this.count = count;
}
}