如何在 JPA 和 Hibernate 中返回所有值
Posted
技术标签:
【中文标题】如何在 JPA 和 Hibernate 中返回所有值【英文标题】:How to return all values in JPA and Hibernate 【发布时间】:2021-07-25 06:06:28 【问题描述】:我有一个场景,我尝试使用hibernate
和JPA
从选择语句返回所有结果。由于某些奇怪的原因,所有数据库中的值的数量都得到了正确的计数,因此它返回了第一个值 x 次,而不是从查询中获取所有唯一值。
我在数据库中执行select * from HSEC01X where hea ='0184' and hnum='0005'
时的查询输出
+-------+---------+--------+
| HEA | HNUM | HNAME |
+-------+---------+--------+
| 0184 | 0005 | John |
| 0184 | 0005 | Jane |
| 0184 | 0005 | janet |
| 0184 | 0005 | Arthur |
+-------+---------+--------+
这是我尝试过的。
@Query("SELECT e FROM HSEC01X e WHERE e.hea = ?1 AND e.hnum = ?2")
public Iterable<HSEC01X> findHSEC01XByheaAndhnum(@Param("hea") String hea, @Param("hnum") String hnum);
这个结果集有四条记录,但它只打印第一个结果四次,而不是查询中找到的所有值,这是我得到的json
响应
[
"hea": "0014",
"hnum": "0005",
"hnames": "john"
,
"hea": "0014",
"hnum": "0005",
"hnames": "john"
,
"hea": "0014",
"hnum": "0005",
"hnames": "john"
,
"hea": "0014",
"hnum": "0005",
"hnames": "john"
]
而不是得到
[
"hea": "0014",
"hnum": "0005",
"hnames": "john"
,
"hea": "0014",
"hnum": "0005",
"hnames": "Jane"
,
"hea": "0014",
"hnum": "0005",
"hnames": "janet"
,
"hea": "0014",
"hnum": "0005",
"hnames": "Arthur"
]
这是模型
@Entity
@Table(name = "HSEC01X")
public class HSEC01X
@Id
@Column(name = "HEA")
private String hea;
@Column(name = "HNUM")
private String hnum;
@Column(name = "HNAME")
private String hnames;
我的控制器
@GetMapping("/laptops/brandandprice")
public ResponseEntity<List<HSEC01X>> getLaptopsByBrandAndPrice(@RequestParam String hea, String hnum)
return new ResponseEntity<>((List<HSEC01X>) hsec01X_repository.findHSEC01XByheaAndhnum(hea, hnum), HttpStatus.OK);
如何从 select 语句中正确返回所有不同的结果?
【问题讨论】:
你有主键的东西那么怎么可能有 4 条具有相同键的记录。@Id@Column(name = "HEA") 嗨@S.Anushan,感谢您的反馈,但很抱歉我不明白 你有 0184 作为四条记录的主键 哦,有道理,谢谢 【参考方案1】:您可以尝试为唯一的整数主键创建一个单独的字段并使用@JsonIgnore 对其进行注释。这将使您的数据库更加实用,同时保持查询返回的 JSON 格式相同。
@Entity
@Table(name = "HSEC01X")
public class HSEC01X
@Id
@JsonIgnore
@Column(name = "id")
private int id;
@Column(name = "HEA")
private String hea;
@Column(name = "HNUM")
private String hnum;
@Column(name = "HNAME")
private String hnames;
对于SQL查询,如果我没记错的话,写Query("SELECT * FROM HSEC01X WHERE hea = ?1 AND hnum = ?2")
不是更简单吗?
【讨论】:
【参考方案2】:您使用@Id
提到hea
作为HSEC01X
实体的主键
注释。
如果hea
不是表的主键,则应从实体中删除@Id
注释。但是hea
是主键,您不能在表中插入四次0184
。
【讨论】:
【参考方案3】:记录的 id 应该是唯一的。它可以是多列,但组合必须是唯一的。
这就是@Id
注解所理解的。对于 Hibernate 来说,查询返回具有相同 ID 的不同行是没有意义的,因此当它遇到相同 ID 时,它会跳到下一行并重用之前的记录。
你有两个选择:
-
按照 Dave Andrea 的建议添加适当的 ID 列。 (正确的解决方案)
在其他两列上添加
@Id
,并由三列键确定唯一性。 (非常不推荐)
【讨论】:
以上是关于如何在 JPA 和 Hibernate 中返回所有值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JPA 和 Hibernate 设置默认查询超时?
如何使用 Hibernate 为 Spring data JPA 的所有查找方法添加全局 where 子句?