如何在spring数据存储库nativeQuery中使用oracle NVL函数

时间:2017-06-05 19:32:30

标签: spring oracle10g spring-data

我正在尝试使用oracle' NVL函数在Spring Data Repository的nativeQuery中。

当我在null参数中传递programId值时,它会抛出异常(ORA-00932: inconsistent datatypes: expected NUMBER got BINARY)并且如果我在" programId"中传递有效值然后它正常运作。

public interface ProgramRulesRepository
{
  public static final String FIND_PROGRAM_RULES_BY_PARTICIPANT_ID_AND_ROLE_OR_PROGRAM = " SELECT DISTINCT pr.id , pr.program_id , prgm.display_name , pr.group_id , pr.type , pr.cmmo_key FROM  program prgm , program_rule pr , program_audience pa , participant_audience paa WHERE prgm.id = pa.program_id AND pr.program_id = pa.program_id AND pa.audience_id = paa.audience_id AND pr.type = :roleType  AND paa.participant_id = :participantId "
      + " AND pr.program_id = NVL ( :programId ,pr.program_id )";

  @Query( value = FIND_PROGRAM_RULES_BY_PARTICIPANT_ID_AND_ROLE_OR_PROGRAM, nativeQuery = true )
List<Object[]> findByParticipantIdAndRoleTypeOrProgramId( @Param( "participantId" ) Long participantId, @Param( "roleType" ) String roleType, @Param( "programId" ) Long programId );


}

例外:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY

2 个答案:

答案 0 :(得分:0)

我在MongoDB中遇到了这个问题。但是我可以通过使用mongoTemplate来解决此问题,

 Query query = new Query();
 Criteria criteria = new Criteria();
 List<Criteria> orCriterias = new ArrayList<>();
 if( dto.getId() != null) {    
   orCriterias.add(Criteria.where("id").is(Integer.parseInt(dto.getId())));
 }
 ... so on for other fields
criteria.orOperator(orCriterias.toArray(new Criteria[orCriterias.size()]));
query.addCriteria(criteria);
List<StudentDTO> recordsList = mongoTemplate.find(query, StudentDTO.class, 
"student_collection");

答案 1 :(得分:0)

此问题的一个好的解决方案是:

" AND (:programId IS NULL OR pr.program_id = :programId)"

这样,如果您的param为null,则此句子将为TRUE,并且不会丢弃该寄存器;如果不为null,则将与存储在其字段中的值进行比较。