我正在尝试使用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字段?
答案 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模型。