2017-05-28 6 views
1

私は、2つのパラメータと45の制限パラメータを持つOracleストアドプロシージャを呼び出すスプリングブートレストエンドポイントを構築しようとしています。このコードのすべてがうまくコンパイルが、私はリポジトリを呼び出すときに、私は次のエラーを取得spring data spaとoracleパッケージ

package com.me.data.userservice.repositories; 

import com.me.data.userservice.models.UserDetails; 
import org.springframework.data.jpa.repository.query.Procedure; 
import org.springframework.data.repository.CrudRepository; 
import org.springframework.data.repository.query.Param; 

/** 
* Created by me on 5/27/17. 
*/ 
public interface UserDetailsRepository extends CrudRepository<UserDetails, Long> { 
    @Procedure(name="getUserDetailsSp") 
    public UserDetails findByUserIdAndRegion(@Param("p_in_user_id") String userId, @Param("p_in_region") String region); 
} 

:については

2017-05-27 18:41:27 ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Object of class [org.springframework.data.jpa.repository.query.PartTreeJpaQuery] must be an instance of class org.springframework.data.jpa.repository.query.StoredProcedureJpaQuery; nested exception is java.lang.IllegalArgumentException: Object of class [org.springframework.data.jpa.repository.query.PartTreeJpaQuery] must be an instance of class org.springframework.data.jpa.repository.query.StoredProcedureJpaQuery] with root cause java.lang.IllegalArgumentException: Object of class [org.springframework.data.jpa.repository.query.PartTreeJpaQuery] must be an instance of class org.springframework.data.jpa.repository.query.StoredProcedureJpaQuery at org.springframework.util.Assert.instanceCheckFailed(Assert.java:389) at org.springframework.util.Assert.isInstanceOf(Assert.java:327) at org.springframework.util.Assert.isInstanceOf(Assert.java:339) at org.springframework.data.jpa.repository.query.JpaQueryExecution$ProcedureExecution.doExecute(JpaQueryExecution.java:300) at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:82) at...

package com.me.data.userservice.models; 

import javax.persistence.*; 
import java.util.Date; 

/** 
* Created by me on 5/27/17. 
*/ 
@Entity 
@NamedStoredProcedureQueries({ 
     @NamedStoredProcedureQuery(name = "getUserDetailsSp", 
       procedureName = "user_pkg.get_user_details", 
       parameters = { 
         @StoredProcedureParameter(mode = ParameterMode.IN, name = "p_in_user_id", type = Long.class), 
         @StoredProcedureParameter(mode = ParameterMode.IN, name = "p_in_region", type = String.class) 
       }, 
       resultClasses = UserDetails.class) 
}) 
public class UserDetails { 
    //region Private members 
    @Id 
    private Long user_id; 
    private String first_name; 
    private String last_name; 
    private String email; 
    @Column(name = "p_in_user_id", nullable = false) 
    private String userId; 
    private String user_id; 
    @Column(name = "p_in_region", nullable = false) 
    private String region; 
    private Long scnd_user_id; 
    ... 
} 

とリポジトリ:私はエンティティを作成しました何らかの理由で私はこのエラーを解読することに失敗しており、Google上のヘルプを見つけることができません。

これは可能である必要がありますが、複数の戻り値や入力専用パラメータを持つ例は見つかりません。

ADDED詳細

私は実際にちょうど私user_pkg.get_user_detailsが実際にクエリ機能であることに気づきました。これはどのように私のアプリを変更するのですか?

+0

かもしれません@query注釈

@Repository public interface MyObjectRepository extends CrudRepository<MyObject, String> { @Query(value = "EXECUTE [dbo].[myProc] :fieldName, :pages", nativeQuery = true) Set<MyObject> findAllByFieldName(@Param("fieldName") String fieldName, @Param("pages") int pages); } 

経由でそれをやりました。 – alltej

答えて

0

私は解決策を見つけました。私はそれが最高のの解決策であるとは確信していませんが、の解決策です。

まず、リポジトリを標準コンポーネントに変更し、NamedParameterJdbcTemplateとカスタム行マッパーを使用することを選択しました。

@Component 
public class UserDetailsRepository { 

    @Autowired 
    private NamedParameterJdbcTemplate jdbcTemplate; 

    public UserDetails findByUserIdAndDomain(@Param("p_in_user_id") String userId, @Param("p_in_region") String region) { 

     String sql = "select * from TABLE(user_pkg.get_user_details(:p_in_user_id,:p_in_region))"; 
     MapSqlParameterSource namedParameters = new MapSqlParameterSource("p_in_user_id", userId) 
       .addValue("p_in_region", region); 
     UserDetails result = (UserDetails)jdbcTemplate.queryForObject(
       sql, namedParameters, new UserDetailsMapper()); 

     return result; 

    } 
} 

RowMapperの:

import com.me.data.userservice.models.UserDetails; 
import org.springframework.jdbc.core.RowMapper; 

import java.sql.ResultSet; 
import java.sql.SQLException; 

/** 
* Created by me on 5/27/17. 
*/ 
public class UserDetailsMapper implements RowMapper { 
    @Override 
    public Object mapRow(ResultSet resultSet, int i) throws SQLException { 
     UserDetails userDetails = new UserDetails(); 
       userDetails.setAccount_number(resultSet.getString("account_number")); 
     userDetails.setCompany_name(resultSet.getString("company_name")); 
     ... 
     return userDetails; 
    } 
} 
0

私のソリューションや、私は多くのことを試した後 私は@NamedStoredProcedureQueriesであきらめたので、私の回避策は少し違っていたと言うべきです。だから、私はこのリンクは、私が `Procedure` @アノテーションで、この同じ問題を抱えてい役立ちDATA REPOSITORIES IN SPRING DATA JPA

関連する問題