我正在尝试使用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
答案 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,则将与存储在其字段中的值进行比较。