Hibernate не знает, к какому объекту конвертировать результат вашей хранимой процедуры. Я обычно указываю один код / значение возврата для всех моих SP, затем проверяю соответствие полей результирующего класса с одинаковыми именами псевдонимов столбцов в моем результате возврата SP.
Например ...
{ call my_function(:param1, :param2) }
return_code = 404, message = "Page not found"
return_code = 200, message = "OK"
Класс отображается как любой другой POJO, просто убедитесь, что он сериализуем. Я использую что-то вроде этого:
@NamedNativeQueries({
@NamedNativeQuery(name = "myFunction",
query = "{ call my_function(:param1, :param2) }",
resultClass = StoredProc.class)
})
@Entity
public class StoredProc implements Serializable {
private Integer returnCode;
private String message;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "return_code", nullable = false, unique = true)
public Integer getReturnCode() {
return returnCode;
}
public void setReturnCode(Integer returnCode) {
this.returnCode = returnCode;
}
@Column(name = "message")
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Обратите внимание на небольшую разницу в том, как я называю свои сохраненные процессы - я не использую стиль назначения "{? = Call my_function (?,?)}", А вместо этого использую прямую "{call my_function (: param1) ,: param2)} ". В моем коде я определяю эти SP с помощью @NamedNativeQuery
аннотаций и заключаю их в аннотацию @NamedNativeQueries
(множественное число!) И прикрепляю их к своему классу StoredProc
. Таким образом, все в нужном месте ... красиво и аккуратно.
Когда я хочу вызвать один из них из кода, это очень просто:
(StoredProc) getSession().getNamedQuery("myFunction")
.setParameter("param1", value)
.setParameter("param2", value2)
.uniqueResult();
Красиво и просто. И если SP выдает какие-либо ошибки, я получаю их в ответном сообщении, которое затем могу обработать так, как мне нравится (автоматическая отправка отчета об ошибке, отправка сообщения в пользовательский интерфейс и т. Д.)