Oracle 中的 Spring Data JPA + EclipseLink

Posted

技术标签:

【中文标题】Oracle 中的 Spring Data JPA + EclipseLink【英文标题】:Spring Data JPA + EclipseLink in Oracle 【发布时间】:2021-03-13 11:54:09 【问题描述】:

我有这个仓库:

@Repository
public interface EnvaRepository extends JpaRepository<Enva, Long> 

这个查询:

 envaRepository.findAllById(lopn.getEnvans());

但是在控制台我有这个错误:

SELECT t0.PERSONNE_ID, t0.DT_NAISSANCE, t1.PERSONNE_ID FROM PERSONNE t0, ENVA t1
WHERE ((t0.PERSONNE_ID IN ((777,777))) AND (t1.PERSONNE_ID = t0.PERSONNE_ID));

[42000][907] ORA-00907: parenthèse de droite absente

我的配置类:

@Configuration
public class JpaConfiguration extends JpaBaseConfiguration 

    protected JpaConfiguration(DataSource dataSource, JpaProperties properties, ObjectProvider<JtaTransactionManager> jtaTransactionManager, ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) 
        super(dataSource, properties, jtaTransactionManager, transactionManagerCustomizers);
    

    @Override
    protected AbstractJpaVendorAdapter createJpaVendorAdapter() 
        log.debug("Using EclipseLinkJpaVendorAdapter");
        return new EclipseLinkJpaVendorAdapter();
    

    @Bean
    @Primary
    public static JpaProperties properties() 
        final JpaProperties jpaProperties = new JpaProperties();
        jpaProperties.setShowSql(true);
        jpaProperties.setDatabasePlatform("org.eclipse.persistence.platform.database.OraclePlatform");
        return jpaProperties;
    

    @Override
    protected Map<String, Object> getVendorProperties() 
        HashMap<String, Object> map = new HashMap<>();
        map.put(PersistenceUnitProperties.WEAVING, detectWeavingMode());
        return map;
    

    private String detectWeavingMode() 
        return InstrumentationLoadTimeWeaver.isInstrumentationAvailable() ? "true" : "static";
    

【问题讨论】:

spring 是如何构建 JPQL 查询的?它需要使用“ .. in :variable ”而不是将集合变量包装在括号中才能工作。 你能分享你的 Enva 实体吗?您是否调用了除此之外的任何其他查询? 【参考方案1】:
@Query("SELECT e FROM Enva e where e.personneId IN :envantIds")
    List<Enva> findAllById(Iterable<Long> envantIds);

【讨论】:

【参考方案2】:

像这样去掉 IN 语句中的额外括号:

SELECT t0.PERSONNE_ID, t0.DT_NAISSANCE, t1.PERSONNE_ID 
FROM PERSONNE t0, ENVA t1
WHERE ((t0.PERSONNE_ID IN (777,777)) 
AND (t1.PERSONNE_ID = t0.PERSONNE_ID));

【讨论】:

查询是自动为 EclipseLink 构建的 我对 EclispeLink 不熟悉,但也许某处有配置,或者它可能是一个真正的错误!

以上是关于Oracle 中的 Spring Data JPA + EclipseLink的主要内容,如果未能解决你的问题,请参考以下文章

微服务 第六章 springboot 通过Spring-data-jpa 配置Oracle数据源(Spring-data-jpa详细介绍)

如何使用Spring Data JPA在实体中映射Oracle Object类型?

使用 Spring Data Jpa 在 Oracle 中调用存储过程时参数的数量或类型错误

Spring Data Jpa Specification 调用Oracle 函数/方法

Spring Data Jpa Specification 调用Oracle 函数/方法

带有 Spring Data JPA 的 Spring Boot 为 Oracle 数据库上的 findOne(...) 提供了无效字符问题