问题描述
我有两个表 X 和 Y。在表 X (Oracle sql) 中,沿着 X 表中其他列的唯一列(主键)代码.. 代码列可能在表 Y 中有一些具有列 code_id 的记录。我想获取表 Y 中包含代码和表 Y 中其他列的代码的行数
并且我有 springboot entity Entity 我想将结果映射到使用 jpql 所以我想在 JPQL 中查询:
public class Entity {
private int id;
private char code;
private String name;
// constructor & setters / getters
}
和Y表有实体Counter
public class Counter {
private int codeid;
}
我想使用相当于这个 Oracle sql 查询的 jpql 查询
select x.*,(select count(*) from Y y where x.code = y.code_id) as theCount
from X x ORDER BY theCount desc,x.name_ON asc ;
示例:
代码“A”有3个条目,代码“B”有2个条目,代码“C”在表Y中有0个条目。
code name count
A name1 3
B name2 2
C name3 0
解决方法
我做了一些假设,因为我想念你的项目代码。希望我的例子能满足你的需求。它不是同一个 SQL,但它仍然只是 1 个产生相同类型输出的语句。
具有 Code
集合的主要实体 Counter
:
@Data
@Entity
public class Code {
@Id
private Integer id;
private String code;
private String name;
@OneToMany
@JoinColumn(name = "CODE_ID")
private List<Counter> counterList;
}
@Data
@Entity
public class Counter {
@Id
private Integer id;
}
Spring 数据存储库:
public interface CodeRepository extends JpaRepository<Code,Integer> {
@Query("select c.code,c.name,count(l) as amount from Code c join c.counterList l group by c.code,c.name")
List<Object[]> getSummary();
}
它返回:
A,TESTNAME1,3
B,TESTNAME2,2
如果将以下内容插入到数据库中:
INSERT INTO CODE (ID,CODE,NAME) VALUES (1,'A','TESTNAME1');
INSERT INTO COUNTER (ID,CODE_ID) VALUES (123,1);
INSERT INTO COUNTER (ID,CODE_ID) VALUES (124,CODE_ID) VALUES (125,1);
INSERT INTO CODE (ID,NAME) VALUES (2,'B','TESTNAME2');
INSERT INTO COUNTER (ID,CODE_ID) VALUES (234,2);
INSERT INTO COUNTER (ID,CODE_ID) VALUES (235,2);
结果是这样产生的:
codeRepository.getSummary()
.forEach(sum -> System.out.println(sum[0] + "," + sum[1] + "," + sum[2]));