问题描述
我需要执行不返回任何数据的存储过程调用,我尝试使用 NamedStoredProcedureQuery 但它失败了
java.lang.IllegalArgumentException:未找到具有该名称的@NamedStoredProcedureQuery:send_message
SendMessage.java
@NamedStoredProcedureQuery(
name = "send_message",procedureName = "send_message",resultClasses = {SendMessage.class},parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN,type = Date.class,name = "date"),@StoredProcedureParameter(mode = ParameterMode.IN,type = String.class,name = "message")
}
)
public class SendMessage implements Serializable {
}
MessageDao.java
@Component
public class MessageDao {
@PersistenceContext
private EntityManager entityManager;
public void sendMessage(SendRequest sendRequest){
StoredProcedureQuery query = this.entityManager.createNamedStoredProcedureQuery("send_message")
.registerStoredProcedureParameter(0,Date.class,ParameterMode.IN)
.registerStoredProcedureParameter(1,String.class,ParameterMode.IN);
query.setParameter(0,sendRequest.getBusinessDate());
query.setParameter(1,sendRequest.getMessage());
query.execute();
}
低于异常
java.lang.IllegalArgumentException: No @NamedStoredProcedureQuery was found with that name : send_message
at org.hibernate.internal.SessionImpl.createNamedStoredProcedureQuery(SessionImpl.java:3586) ~[hibernate-core-5.4.28.Final.jar:5.4.28.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:362) ~[spring-orm-5.3.4.jar:5.3.4]
at com.sun.proxy.$Proxy88.createNamedStoredProcedureQuery(UnkNown Source) ~[na:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[spring-orm-5.3.4.jar:5.3.4]
at com.sun.proxy.$Proxy88.createNamedStoredProcedureQuery(UnkNown Source) ~[na:na]
有什么办法可以让这个工作,我不能把@Entity放在SendMessage.java中,因为它不与任何数据库表相关联,也不要返回任何东西?
解决方法
注解 @NamedStoredProcedureQuery
仅在您将其放在实体上时才有效。
你没有可以放置它的实体吗?
或者,您可以在 orm.xml
中创建一个 src/resources/META-INF
文件并将其放在那里:
<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://www.datanucleus.org/xsd/jpa/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.datanucleus.org/xsd/jpa/orm
http://www.datanucleus.org/xsd/jpa/orm_2_2.xsd" version="2.2">
<named-stored-procedure-query name="send_message" result-class="SendMessage"
procedure-name="send_message">
<parameter direction="IN" name="date" type="Date"/>
<parameter direction="IN" name="message" type="String"/>
</named-stored-procedure-query>
</entity-mappings>