当前位置: 首页 > 知识库问答 >
问题:

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

邓建柏
2023-03-14

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

当我在programId参数中传递null值时,它会抛出异常(ORA-00932:不一致的数据类型:预期的数字是二进制的)如果我在“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

共有3个答案

皮承基
2023-03-14

我在MongoDB上遇到过这个问题。但是我可以通过使用mongoTemboard来解决这个问题,

 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");
秦景福
2023-03-14

解决这个问题的好办法是:

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

这样做,如果您的参数为null,则这句话将导致TRUE并且不会丢弃寄存器,如果它不是null,则将与存储在其字段中的值进行比较。

何辰沛
2023-03-14

使用Hibernate时避免使用NVL和COALESCE。COALESCE函数需要具有相同类型的所有参数。NVL使用隐式转换,当有BINARY或VARBINARY时效果不佳。这个BINARY来自哪里?好吧,Hibernate将NULL值设置为BINARY类型,并忽略Java支持的真实数据类型。当您将日志记录级别设置为跟踪时,您可以在输出中看到:

binding parameter [1] as [VARBINARY] - [null]

因此,当其他类型的in-COALESCE或NVL函数是例如NUMBER时,您将得到错误ORA-00932。

 类似资料:
  • 我有一个Spring仓库如下: 实体类为: 调用findOne或findByName时,会给出以下错误: 如何使用Spring JPA存储库而没有默认构造函数?我想保留实例字段,代码和名称,最终。

  • 我突然想到,可以用三个基于泛型的类来替换每个对象类型的多个类,从而节省大量的样板代码。我不是很清楚该怎么做,事实上这是不是一个好主意?

  • 我想要一个在Spring数据的帮助下创建的存储库(例如)。我不熟悉spring-data(但不熟悉spring),我使用本教程。我选择的处理数据库的技术是JPA2.1和Hibernate。问题是我不知道如何为这样的存储库编写单元测试。 让我们以方法为例。由于我正在进行测试--首先,我应该为它编写一个单元测试--这就是我遇到三个问题的地方: > 首先,如何将的模拟注入到不存在的接口实现中?Sprin

  • 我刚开始冬眠。我需要在postgres中存储文件,列的数据类型是。我在互联网上四处寻找这个案例的工作演示,但我找不到任何。 Hibernate映射:

  • 我试图将一个几何体对象存储到我的postgist数据库中,该数据库有一个带有几何体列的表。我从另一个带有几何列的表格中得到了几何值,我打印了我之前得到的值,结果没问题。要存储几何体值,我使用下一个函数: 但我总是得到这个错误: 组织。postgresql。util。PSQLException:无法推断用于org实例的SQL类型。波斯吉斯。指向使用带有显式类型值的setObject()指定要使用的类

  • 它是否将其存储在缓存中?我有一个应用程序,但应用程序中没有任何地方。属性是提到的db详细信息。我可以通过邮递员存储数据和查询它。