【问题标题】:Hibernate insert doesn't work with custom native query休眠插入不适用于自定义本机查询
【发布时间】:2021-10-15 06:11:09
【问题描述】:

在一个 spring boot 项目和数据库 SQL Server 中,我正在做一些插入,我需要返回记录的 id 我有一个字段很少的实体:

public class PackGroupEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long group_id;
    private String group;
    private String remark;
    private String description;
    ....
}

我简化插入只是为了问问题。

我有一个插入语句,我需要从插入的记录中检索 id。

String query = String.format(
                "insert into pack_group(group, remark, description ) " +
                "values ( %s, %s, %s)", "a","b","c"  );
Query q = entityManager.createNativeQuery(query );
BigInteger biid = (BigInteger) q.getSingleResult();
long id = biid.longValue();

我得到了这个错误 com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.

基于这个答案here 我可以使用returning id 所以我尝试了但是:

String query = String.format(
                "insert into pack_group(group, remark, description ) " +
                "values ( %s, %s, %s ) returning group_id;", "a","b","c"  );
Query q = entityManager.createNativeQuery(query );
BigInteger biid = (BigInteger) q.getSingleResult();
long id = biid.longValue();

但它会引发错误

com.microsoft.sqlserver.jdbc.SQLServerException:“返回”附近的语法不正确。

有人可以帮帮我吗?

【问题讨论】:

  • 永远不要像这样输入用户字符串。这是一个重大的安全漏洞。从Bobby Tables 了解如何避免它。

标签: java sql-server spring-boot hibernate nativequery


【解决方案1】:

这东西是SQL Server不支持返回语法。

如果您想获取插入行的 id - 您应该使用关键字 output

这是使用带有 INSERT 语句的输出的官方文档: https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15#a-using-output-into-with-a-simple-insert-statement

您还可以通过 C# 的不同 SQL Server 版本的示例查看此答案(但 Java 的查询没有不同): https://stackoverflow.com/a/18373524/16644196

【讨论】:

    【解决方案2】:

    SQLServer 不支持returning 子句。相反,请使用output 子句。

    String query = String.format("INSERT INTO pack_group(group, remark, description) " 
                    + "OUTPUT INSERTED.group_id " 
                    + "VALUES( %s, %s, %s )", "a","b","c");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      相关资源
      最近更新 更多