Spring Data JPA“列名ID无效”

Posted

技术标签:

【中文标题】Spring Data JPA“列名ID无效”【英文标题】:Spring Data JPA "The column name Id is not valid" 【发布时间】:2018-11-24 08:52:21 【问题描述】:

我正在尝试使用 Springboot 项目对 SQL Server 数据库执行原始 SQL 查询。

我有以下存储库:

public interface BatchRepository extends PagingAndSortingRepository<Transaction, String> 

@Override
@Query(value = "SELECT DISTINCT(T.BatchNumber), T.Operator FROM TABLE T", nativeQuery = true)
Iterable<Transaction> findAll();


我支持查询的实体是:

@Entity
@Table(name = "TABLE")
public class Transaction implements EntityId<String>, CreatedDateTime, ModifiedDateTime

 ....omitted for brevity

@Id
@GenericGenerator(name = "generator", strategy = "guid")
@GeneratedValue(generator = "generator")
@Column(name = "Id", columnDefinition = "uniqueidentifier")
public String getId() 
    return id;


public void setId(String id) 
    this.id = id;


@Column(name = "BatchNumber")
public String getBatchNumber() 
    return batchNumber;


public void setbatchNumber(String batchNumber) 
    this.batchNumber = batchNumber;


@Column(name = "Operator")
public String getOperator() 
    return operator;


public void setOperator(String operator) 
    this.operator = operator;

我不断收到错误:

Hibernate: 
SELECT
    DISTINCT(T.BatchNumber),
    T.Operator
FROM
    TABLE T
2018-06-14 09:10:06.744  WARN 2844 --- [apr-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: S1093
2018-06-14 09:10:06.744 ERROR 2844 --- [apr-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : **The column name Id is not valid.**

这是表定义。 (注意我已经替换了一些列/表名)

CREATE TABLE [dbo].[Table](
[Id] [uniqueidentifier] NOT NULL,
[BatchNumber] [nvarchar](max) NULL,
[JobType] [nvarchar](max) NULL,
[Operator] [nvarchar](max) NULL,
[TransactionNumber] [int] NULL,
[Status] [nvarchar](100) NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL,

此外,此查询在 SSMS 和 Intellij 的数据库窗口中执行良好。这不仅仅是查询。

我的查询根本没有引用 Id 字段?

【问题讨论】:

如果在这里大写Id会怎样:public void setId(String id) this.id = id; 没有变化。我认为这不会起作用,因为我在标准 CrudRepository 中使用相同的实体没有问题。这里的变化是我使用原始 sql 来获取投影对象。 请在SQL中发布表定义 我用表格 def 更新了问题。我不认为这是查询。该查询在 SSMS 中运行良好。 Hibernate ORM 映射有什么特别之处吗? 试试@GenericGenerator(name = "generator", strategy = "uuid2") 【参考方案1】:

所以我弄清楚了发生了什么。

我需要返回数据的模型需要为 select 子句中的每一列设置 setter,并且 setter 需要匹配 select 子句中的内容。换句话说,模型中不能有空属性。

就我而言,我有一个界面

public interface EntityId<T> 
T getId();
void setId(T id);

我在我的所有实体上都使用它。基本上,我有基本的抽象类,允许我按 Id 搜索我的所有实体。

使用该接口 - 我最终在我的支持实体中得到了一个不在我的选择语句中的无关设置器 (id)。

因此,对于 Springboot 和 JPA 的任何其他新来者 - 当您冒险超出实体类和数据库表之间的 1:1 映射(即连接或任何其他形式的原始 sql/JPQL 查询)时 - 您需要确保您的 select 子句中的列与模型中的属性对齐。

我只是创建了一个具有正确属性的新 @Entity 模型。

【讨论】:

以上是关于Spring Data JPA“列名ID无效”的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA - 将列名和值作为参数传递

Spring Data JPA 原生查询结果实体

Spring Boot/JPA:引用的保留字列名不起作用

DB 列上的 Spring JPA 错误返回与列名相关的错误

Spring JPA/Hibernate findby 列名返回空集合

集成Spring Data JPA