Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server JPA、Hibernate、SQL Server和表值参数_Sql Server_Jpa_Spring Data Jpa - Fatal编程技术网

Sql server JPA、Hibernate、SQL Server和表值参数

Sql server JPA、Hibernate、SQL Server和表值参数,sql-server,jpa,spring-data-jpa,Sql Server,Jpa,Spring Data Jpa,我将JPA与Hibernate一起使用,并希望使用表值参数调用存储过程。理想情况下,我希望使用以下内容: @Transactional @Procedure(procedureName = "test_procedure1") void testProcedure1( @Param("value1") int value1, @Param("value2") String val

我将JPA与Hibernate一起使用,并希望使用表值参数调用存储过程。理想情况下,我希望使用以下内容:

    @Transactional
    @Procedure(procedureName = "test_procedure1")
    void testProcedure1(
        @Param("value1") int value1, 
        @Param("value2") String value2,
        @Param("value3") MyTableValuedParameter value);
其中value3是表值参数

但是,如果这是不可能的,我也可以通过更直接地使用MicrosoftSQLServer驱动程序(它支持表值参数)来调用该过程。但是,我不确定在使用Spring数据时是否可能或者如何使用SQL Server驱动程序

所以我的问题是:

  • 是否可以使用表值参数调用存储过程 使用带有@Procedure参数的JPA
  • 如果没有,是否可以使用底层SQL Server驱动程序 使用时使用表值参数调用存储过程 Spring数据框架

  • 我无法用JPA本身解决这个问题。我需要使用SQL Server驱动程序API

    所以我认为你可以这样做:

    import com.microsoft.sqlserver.jdbc.SQLServerDataTable
    import com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement
    import javax.sql.DataSource
    
    class YourRepository(private val dataSource: DataSource) {
    
      open fun save(yourParameter: YourParameter): Boolean =
        dataSource
          .connection
          .prepareStatement("{CALL test_procedure1 (?)}")
          .use { statement ->
            val preparedStatement = statement.unwrap(SQLServerPreparedStatement::class.java)
    
            val dataTable = SQLServerDataTable().apply {
              addColumnMetadata("value1", java.sql.Types.INTEGER)
              addColumnMetadata("value2", java.sql.Types.NVARCHAR)
              addColumnMetadata("value3", java.sql.Types.NVARCHAR)
    
              addRow(yourParameter.value1, yourParameter.value2, yourParameter.value3)
            }
    
            preparedStatement.setStructured(1, "TestTVP", dataTable)
    
            return preparedStatement.execute()
          }
    }
    

    您始终可以创建一个自定义方法实现并获得一个
    数据源。