"could not extract ResultSet" 在 JPQL GROUP BY 查询中
"could not extract ResultSet" in JPQL GROUP BY query
在带有 Spring Data JPA 的 Spring Boot 1.5 应用程序中,我有一个 TDR
table 像:
Table TDR
-----------------------
id | c_id | m_id | p_id
1 | 1 | 1 | 1
2 | 1 | 1 | 2
3 | 2 | 1 | 1
4 | 2 | 1 | 2
5 | 3 | 1 | 1
我需要在其中找到按 m_id
和 p_id
分组的最后记录。使用 PostgreSQL SQL,我使用 MAX
聚合函数执行此操作:
SELECT t.id, t.c_id, t.m_id, t.p_id
FROM (
SELECT MAX(id) AS id, m_id, p_id
FROM tdr
WHERE m_id = 1 -- <<< parameterized below
GROUP BY m_id, p_id
) m JOIN tdr t ON t.id = m.id
哪个returns正确记录:
Table TDR
-----------------------
id | c_id | m_id | p_id
4 | 2 | 1 | 2
5 | 3 | 1 | 1
由于 GROUP BY
不包含 c_id
,因此 SQL 结构为 correlated sub-query and matched with a join (see this question 以获取详细信息)。
我想用这个 Lombok @Data
实体将这个 SQL 转换为 JPQL:
@Data
@Entity
@Table(name = "TDR")
public class TDR implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;
@ManyToOne(optional=false, cascade = { CascadeType.ALL })
@JoinColumn(name="m_id")
private M m;
@ManyToOne(optional=false, cascade = { CascadeType.ALL })
@JoinColumn(name="p_id")
private P p;
@ManyToOne(optional=false, cascade = { CascadeType.ALL })
@JoinColumn(name="c_id")
private C c;
}
但是我的 JPQL 用于具有参数化 m ID (:m_id
) 的相关子查询:
SELECT t FROM TDR t WHERE t.id in (
SELECT MAX(t.id) AS id, t.m, t.p FROM TDR t WHERE t.m = :m GROUP BY t.m, t.p
)
导致此错误:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
// at ...
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
// at ...
Caused by: org.postgresql.util.PSQLException: ERROR: subquery has too many columns
让我突然想到的是你的第一个 SELECT:
SELECT FROM
...未说明您选择的列
Select 只是关联子查询中的连接列:
SELECT t FROM TDR t WHERE t.id in (
SELECT MAX(t.id) FROM TDR t WHERE t.m = :m GROUP BY t.m, t.p
)
ObjectDB GROUP BY article was helpful as was this question.
在带有 Spring Data JPA 的 Spring Boot 1.5 应用程序中,我有一个 TDR
table 像:
Table TDR
-----------------------
id | c_id | m_id | p_id
1 | 1 | 1 | 1
2 | 1 | 1 | 2
3 | 2 | 1 | 1
4 | 2 | 1 | 2
5 | 3 | 1 | 1
我需要在其中找到按 m_id
和 p_id
分组的最后记录。使用 PostgreSQL SQL,我使用 MAX
聚合函数执行此操作:
SELECT t.id, t.c_id, t.m_id, t.p_id
FROM (
SELECT MAX(id) AS id, m_id, p_id
FROM tdr
WHERE m_id = 1 -- <<< parameterized below
GROUP BY m_id, p_id
) m JOIN tdr t ON t.id = m.id
哪个returns正确记录:
Table TDR
-----------------------
id | c_id | m_id | p_id
4 | 2 | 1 | 2
5 | 3 | 1 | 1
由于 GROUP BY
不包含 c_id
,因此 SQL 结构为 correlated sub-query and matched with a join (see this question 以获取详细信息)。
我想用这个 Lombok @Data
实体将这个 SQL 转换为 JPQL:
@Data
@Entity
@Table(name = "TDR")
public class TDR implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;
@ManyToOne(optional=false, cascade = { CascadeType.ALL })
@JoinColumn(name="m_id")
private M m;
@ManyToOne(optional=false, cascade = { CascadeType.ALL })
@JoinColumn(name="p_id")
private P p;
@ManyToOne(optional=false, cascade = { CascadeType.ALL })
@JoinColumn(name="c_id")
private C c;
}
但是我的 JPQL 用于具有参数化 m ID (:m_id
) 的相关子查询:
SELECT t FROM TDR t WHERE t.id in (
SELECT MAX(t.id) AS id, t.m, t.p FROM TDR t WHERE t.m = :m GROUP BY t.m, t.p
)
导致此错误:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
// at ...
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
// at ...
Caused by: org.postgresql.util.PSQLException: ERROR: subquery has too many columns
让我突然想到的是你的第一个 SELECT:
SELECT FROM
...未说明您选择的列
Select 只是关联子查询中的连接列:
SELECT t FROM TDR t WHERE t.id in (
SELECT MAX(t.id) FROM TDR t WHERE t.m = :m GROUP BY t.m, t.p
)
ObjectDB GROUP BY article was helpful as was this question.