命名和索引参数在带有 Spring Boot 3 的 EclipseLink 中不起作用

问题描述 投票:0回答:1

我正在尝试在 Spring Boot 3 应用程序中使用 EclipseLink 作为 JPA 提供程序。我似乎遗漏了一些东西,因为 Query.setParameter() 无法设置命名(:param)或枚举(?1)参数。本机查询和 JPQL 查询都会发生这种情况。但是,他们确实与 ?样式(无编号)。

我的代码是这样的:

@Autowired
private EntityManager entityManager;

public List<SomeDto> findBySomeAttr(final String someAttr) {

        // This is actually a longer and more complex query that I have in a sql file.
        String sql = "SELECT * FROM SOME_TABLE SM WHERE SM.SOME_ATTR = :someAttr";

        Query query = this.entityManager.createNativeQuery(sql, "SomeDtoMapping");
        query.setParameter("someAttr", someAttr);

        return query.getResultList();
}

如果我尝试使用

query.getParameterValue("someAttr")
获取参数,则会收到此错误:

IllegalArgumentException@133 "java.lang.IllegalArgumentException: No parameter with name : someAttr was found within the query: DataReadQuery(sql="SELECT * FROM SOME_TABLE SM WHERE SM.SOME_ATTR = :someAttr")."

我读过一些关于 Query 是代理实例的内容,但对我来说似乎并非如此:

query.getClass()
Class (EJBQueryImpl)@125 "class org.eclipse.persistence.internal.jpa.EJBQueryImpl"

这样也行不通:

@Query(
    value = "SELECT * FROM SOME_TABLE SM WHERE SM.SOME_ATTR = :someAttr",
    nativeQuery = true)
List<Object[]> findTest(@Param("someAttr") String someAttr);

但是用 ?1 替换 :someAttr 就可以了。

spring-boot spring-data-jpa eclipselink nativequery
1个回答
0
投票

JPA 本机查询和 JDBC 查询需要构造“?1”。 仅在 JPA 查询语言中允许使用构造“:param”。

© www.soinside.com 2019 - 2024. All rights reserved.