Spring Data JPA"列名Id无效"

时间:2018-06-14 14:26:59

标签: sql-server spring-data-jpa

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

我有以下资料库:

<ItemsControl>
    <ItemsControl.Items>
        <Rectangle Width="50" Height="50" Fill="Blue" />
        <Rectangle Width="50" Height="50" Fill="Black" />
        <Rectangle Width="50" Height="50" Fill="Yellow" Margin="10,10,0,0" />
    </ItemsControl.Items>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

我支持查询的实体是:

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.**

此查询在SSMS和Intellij中的数据库窗口中也可以正常执行。它本身不是查询。

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

1 个答案:

答案 0 :(得分:0)

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

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

在我的情况下,我有一个界面

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

}

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

使用该接口 - 我最后在我的后台实体中使用了一个无关的setter(id),它不在我的select语句中。

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

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