我有一个过程,给定一些输入将产生一组输出参数。我能够调用该过程并获得结果(尽管是作为hashmap),但是尽管我尽了最大努力,还是无法从存储库生成实体或POJO。
详细说明我想要达到的目标:
给定的实体:
@NamedStoredProcedureQuery(
name = "someProcedure",
procedureName = "SOME_PROCEDURE",
parameters = [
StoredProcedureParameter(mode = ParameterMode.IN, name = "IN_ONE", type = String::class),
StoredProcedureParameter(mode = ParameterMode.IN, name = "IN_TWO", type = String::class),
StoredProcedureParameter(mode = ParameterMode.IN, name = "IN_THREE", type = String::class),
StoredProcedureParameter(mode = ParameterMode.OUT, name = "OUT_ONE", type = String::class),
StoredProcedureParameter(mode = ParameterMode.OUT, name = "OUT_TWO", type = String::class),
StoredProcedureParameter(mode = ParameterMode.OUT, name = "OUT_THREE", type = String::class)],
resultClasses = [ResultClass::class])
@Entity
data class ResultClass(
@Id
@GeneratedValue
val id: Long
@Column(name = "OUT_ONE")
val outOne: String,
@Column(name = "OUT_TWO")
val outTwo: String,
@Column(name = "OUT_THREE")
val outThree: String
)
与repo相应:
@Repository
interface ResultClassRepo : CrudRepository<ResultClass, Long> {
@Procedure(name = "someProcedure")
@Transactional
fun someProcedure(
@Param("IN_ONE")
inOne: String,
@Param("IN_TWO")
inTwo: String,
@Param("IN_THREE")
inThree: String): ResultClass
}
即使提供了resultclass,结果仍然是一个hashmap,所以我得到了一个强制转换异常。我已经尝试了使用@SqlResultSetMapping定义映射的方法,但结果是相同的。
就好像没有"manual"就不能映射我们的参数。干预,所以我的问题是,如果这是可行的,或者如果@NamedStoredProcedureQuery
只支持哈希图作为在这种情况下的结果?
免责声明:在过程结束时,没有关联表可以选择,也没有关联实体,因为我认为这是类似问题的可能解决方案。
我希望避免为存储库定制实现,因此我认为在这种情况下这不是一个有效的解决方案。
供将来观看的人参考。我没有找到使用所描述的确切方法的解决方案,但是使用@Query
工作得很好:
@Repository
interface ResultClassRepo : CrudRepository<ResultClass, Long> {
@Query(value = "exec [procedure] @IN_ONE = :IN_ONE, @IN_TWO = :IN_TWO, @IN_THREE = :IN_THREE", nativeQuery = true)
fun someProcedure(
@Param("IN_ONE")
inOne: String,
@Param("IN_TWO")
inTwo: String,
@Param("IN_THREE")
inThree: String): ResultClass
}
其中ResultClass
像一个正常实体一样构建(只是没有表)。