我如何使用 spring 和 jpa 调用存储过程

Moh*_*han 5 spring stored-procedures jpa

我是使用 JPA 技术的 SPRING 新手。

我正在尝试调用用 mysql 5 编写的存储过程。当我尝试使用存储过程获取数据时,将其称为“喷出异常”。

org.springframework.dao.InvalidDataAccessApiUsageException: : 查询必须以ororg.hibernate.QueryException开头:嵌套例外是: : 查询必须以or开头: ]SELECTFROMcall [call st_proc_getusers()];java.lang.IllegalArgumentExceptionorg.hibernate.QueryExceptionSELECTFROMcall [call st_proc_getusers()

我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit  name="SPT3" transaction-type="RESOURCE_LOCAL">
            <mapping-file>META-INF/persistence-query.xml</mapping-file>
            <class>com.spt3.pojo.Users</class>
            <properties>
                    <property name="hibernate.dialect" value=">org.hibernate.dialect.MySQLDialect" />
                    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/spring_security" />
                    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
                    <property name="hibernate.connection.username" value="user" />
                    <property name="hibernate.connection.password" value="pass" />
                    <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
                    <property name="hibernate.max_fetch_depth" value="3"/>
                    <property name="hibernate.query.factory_class" value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/>
                    <property name="hibernate.query.substitutions" value="true 1, false 0"/>
                    <property name="hibernate.show_sql" value="true"/>
                    <property name="hibernate.hbm2ddl.auto" value="create"/>
            </properties>
    </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

我试过代码是

package com.spt3.dao;

import com.spt3.pojo.Users;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import org.springframework.orm.jpa.JpaCallback;
import org.springframework.orm.jpa.support.JpaDaoSupport;
import org.springframework.transaction.annotation.Transactional;


@Transactional
public class JpaUsersDao extends JpaDaoSupport {

    public void getResultsByStoredProcedure() {       
        List list=(ArrayList)getJpaTemplate().execute(new JpaCallback() {
            public List doInJpa(EntityManager em) throws PersistenceException {
                javax.persistence.Query query=em.createQuery("call st_proc_getusers()"); // Here the procedure call 
                return query.getResultList(); // returning result list
            }
        });        
    }

}
Run Code Online (Sandbox Code Playgroud)

实际上我不知道如何使用jpa模板调用存储过程。

如何从 Spring JPA 调用存储过程?

请给出解决方案以摆脱这个问题。

Xav*_*ica 4

EntityManager.createNativeQuery()代替使用。我认为不可能通过 JPA 查询调用存储过程。

public List doInJpa(EntityManager em) throws PersistenceException {
  javax.persistence.Query query=em.createNativeQuery("call st_proc_getusers()"); 
  return query.getResultList(); 
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用@NamedNativeQuery.