我正在尝试在 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 就可以了。
JPA 本机查询和 JDBC 查询需要构造“?1”。 仅在 JPA 查询语言中允许使用构造“:param”。