如何在 JPA 和 Hibernate 中返回所有值

Posted

技术标签:

【中文标题】如何在 JPA 和 Hibernate 中返回所有值【英文标题】:How to return all values in JPA and Hibernate 【发布时间】:2021-07-25 06:06:28 【问题描述】:

我有一个场景,我尝试使用hibernateJPA 从选择语句返回所有结果。由于某些奇怪的原因,所有数据库中的值的数量都得到了正确的计数,因此它返回了第一个值 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 设置默认查询超时?

如何在唯一的映射或非对象 JPA 中返回多个结果

如何使用 Hibernate 为 Spring data JPA 的所有查找方法添加全局 where 子句?

Hibernate/JPA @OneToOne 返回空指针异常

JPA:返回多个实体的查询

如何使用 JPA 和 Hibernate 在 UTC 时区中存储日期/时间和时间戳