【问题标题】:The column name is not valid. -> Could not JPA just replace it will null in this case?列名无效。 -> 在这种情况下,JPA 不能直接替换它吗?
【发布时间】: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&lt;List&lt;String&gt;&gt; 虽然我觉得这很烦人 - 因为我有一个组织良好的 @Entity 并且有人刚刚从我想使用的存储过程中省略了一个字段- 我不知道为什么它需要失败并抛出异常,而不是仅仅用 Null 值填充该字段?或者,如果找不到列,我可以定义@Entity,那么它是“null”或“c​​olumnNotFound”还是……?为什么那不可能呢?在这种情况下会出现什么样的不一致?

标签: java sql hibernate jpa mssql-jdbc


【解决方案1】:

只需将缺少的列添加为空:

@Query(value = "SELECT NULL AS ID, NULL AS ID1, ID2, NULL AS ID3 from DATABASE", nativeQuery = true)
List<TestEntity> testNativeQuery ();

【讨论】:

  • 那会工作...但是在我的情况下,查询实际上是一个存储过程,我不允许更改它 - 有没有一种方法可以让 JPA 如此聪明地自动创建一个 Null 值如果没有找到呢? :)
  • 不,这是不可能的。你如何调用存储过程,你使用的是哪个数据库?
  • 存储过程(有效):@Query(value = "STORED_PROC :a, :b", nativeQuery = true) List&lt;List&lt;String&gt;&gt; execStoredProc(@Param("a") String a, @Param("b") String b); 存储过程不起作用,因为我在过程返回的实体中有更多字段,因为我在其他存储过程中需要这些字段:@987654323 @我使用的数据库是MSSQL数据库:driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
  • 我想我会添加一个答案:) 这真的很难在评论中格式化:)
  • 或者更好的是我已经编辑了这个问题:) 如果有人支持这个问题,我也会很好,这样它可以获得更多的牵引力。这是一个有效的问题,还是不是? :) 我试图支持你的答案,因为如果我没有不更改查询的限制,它会起作用.. 但我不能因为我的评分还不够高:(
猜你喜欢
  • 2019-12-14
  • 2011-04-07
  • 1970-01-01
  • 2019-03-24
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2019-04-27
相关资源
最近更新 更多