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(...) 提供了无效字符问题