为了账号安全,请及时绑定邮箱和手机立即绑定

Java Hibernate 奇怪的编组错误?

Java Hibernate 奇怪的编组错误?

繁星coding 2023-05-10 13:18:33
当 Spring Data JPA 从数据库返回数据时,我遇到了问题。我在这里再试一次。下面是设置。Spring V 1.5.15.RELEASEPGV 9.5.4查询语句:CREATE TABLE dmg.gps_user_to_data_set (    group_id int8 NOT NULL,    data_set int4 NOT NULL,    agency_id int8 NOT NULL,    FOREIGN KEY (agency_id) REFERENCES funding_agency(agency_id),    FOREIGN KEY (group_id, data_set) REFERENCES data_set(group_id, data_set))WITH (    OIDS=FALSE) ;回购:public interface GpsUserToDataSetTestRepository extends JpaRepository<GpsUserToDataSetTest, DataSetPK> {    @Query(value = "select group_id,data_set,agency_id from gps_user_to_data_set where group_id=?1 and data_set=?2", nativeQuery = true)    List<GpsUserToDataSetTest> test(Long groupId, Long dataSet);    @Query(value = "select group_id,data_set,agency_id from gps_user_to_data_set where group_id=?1 and data_set=?2", nativeQuery = true)    List<Object> test2(Long groupId, Long dataSet);}实体:@Entity@Data@Table(name = "GPS_USER_TO_DATA_SET")public class GpsUserToDataSetTest implements Serializable {    @EmbeddedId    private DataSetPK primaryKey;    @Column(name = "AGENCY_ID")    private Long agencyId;}测试:System.out.println("ID: "+dataSetPK);System.out.println("YYY : ");gpsUserToDataSetTestRepo.test(dataSetPK.getGroupId(), dataSetPK.getDataSetId()).stream().forEach(e -> {    try {        System.out.println(new ObjectMapper().writeValueAsString(e));    } catch(JsonProcessingException jpe) {    }});System.out.println("ZZZ: ");gpsUserToDataSetTestRepo.test2(dataSetPK.getGroupId(), dataSetPK.getDataSetId()).stream().forEach(e -> {    try {        System.out.println(new ObjectMapper().writeValueAsString(e));    } catch(JsonProcessingException jpe) {    }});所以我运行它并得到两个不同的结果,我希望当接口 GpsUSerToDataSetTest 时封装的信息应该与我使用 java.lang.Object 运行相同的查询时完全相同,但是你可以看到 ids 不一样,下面是数据库和标准输出转储中的数据。我什至不知道在这里说什么,这对我来说似乎很奇怪,并且可能是一个错误?D B:group_id |data_set |agency_id |---------|---------|----------|1356     |1        |2         |1356     |1        |2         |1356     |1        |19        |
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

如果查询结果被捕获到,List<GpsUserToDataSetTest>对象test1()GpsUserToDataSetTest ORM 被填充并添加到列表中。因此,JSON转换后的字符串是ORM.

另一方面,当查询结果被捕获到其中时,List<Object>这些test2()被填充为纯粹的值数组,然后添加到列表中。因此,JSON表示只有值数组。

在存储库中编写一个新方法test3()并将结果捕获到其中List<Map<String, String>>并观察输出。您会注意到字符串中的普通单个键值(没有像 primaryKey 等字段)JSON

编辑

此外,由于返回行中的主键(@Id 或@EmbeddedId)字段相同,因此从 test1() 返回的所有行都是重复的。Hibernate 缓存是这里的原因。这不是 Hibernate 中的错误,而是应该修复数据库或正确使用 @Id 注释的数据。


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信