【发布时间】:2022-01-07 01:10:47
【问题描述】:
我已经搜索了整个 stackoverflow.com,但我没有找到这个讨论。
我知道我的问题,我只是想知道 JPA 是否可以在不做大量工作的情况下以任何方式处理这个问题......
我所拥有的是一个我想与多个 SQL-Native-Queries 一起使用的 @Entity。
@Entity
public class TestEntity {
@Id
private String ID;
private String ID1;
private String ID2;
private String ID3;
}
数据库中的名称等于字段名称。
然后我有两个选择:
SELECT ID1, ID2 from DATABASE;
SELECT ID2 from DATABASE;
以及针对这些选择的两个本机查询:
@Query(value = "SELECT ID2 from DATABASE", nativeQuery = true)
List<TestEntity> testNativeQuery ();
我得到的错误:
[ERROR] 2021-11-30 10:37:20 [main] [SqlExceptionHelper] The column name ID1 is not valid.
我怎么能告诉 JPA,如果它没有找到应该替换它的列名
空 ?
会这么难吗?
一些额外的细节:
我正在使用存储过程 - 这意味着我无法更改查询 - 存储过程由其他人维护。
存储过程(有效):
@Query(value = "STORED_PROC :a, :b", nativeQuery = true)
List<List<String>> execStoredProc(@Param("a") String a, @Param("b") String b);
存储过程不起作用,因为我在该过程返回的实体中有更多字段,因为我需要其他存储过程中的这些字段:
@Query(value = "STORED_PROC :a, :b", nativeQuery = true)
List<TestEntity> execStoredProc(@Param("a") String a, @Param("b") String b);
当我删除这些字段时,该函数可以工作 - 但我在程序的其他部分需要这些字段 - 我希望我可以使用相同的 @Entity
我使用的数据库是 MSSQL 数据库:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
【问题讨论】:
-
您的实体包含 ID、ID1、ID2、ID3,因此所有这些列都必须存在于数据库表中
-
他们会 - 这不是问题所在 - 问题是
SELECT语句不会返回所有 ID - 如果我这样做:SELECT ID, ID1, ID2, ID3 FROM DATABASE那么它会起作用......我会喜欢拥有所有其他值 - 不在 SELECT 中 - 它们将自动为“null”,因为它们被声明为字符串 -
为什么从查询中返回 TestEntity 实体实例?如果您希望它部分填充/不完整,您应该尝试返回一个非实体类,否则它将导致与持久性单元不一致。见stackoverflow.com/a/31966870/496099
-
这是我当前的解决方案 - 我正在返回
List<List<String>>虽然我觉得这很烦人 - 因为我有一个组织良好的 @Entity 并且有人刚刚从我想使用的存储过程中省略了一个字段- 我不知道为什么它需要失败并抛出异常,而不是仅仅用 Null 值填充该字段?或者,如果找不到列,我可以定义@Entity,那么它是“null”或“columnNotFound”还是……?为什么那不可能呢?在这种情况下会出现什么样的不一致?
标签: java sql hibernate jpa mssql-jdbc