当 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 注释的数据。
添加回答
举报
0/150
提交
取消