如何防止 OpenJPA 替换查询中的“常量”参数? [复制]

Posted

技术标签:

【中文标题】如何防止 OpenJPA 替换查询中的“常量”参数? [复制]【英文标题】:How can I prevent OpenJPA from replacing "constant" parameters in my queries? [duplicate] 【发布时间】:2015-07-20 12:41:40 【问题描述】:

当 OpenJPA 将我的常量值替换为 SQL 参数时,我似乎对 CHAR 字段的查询有问题。

示例

在 Oracle 中给定这张表

create table PERSON (
  id char(10) not null,
  type char(3) not null,
  primary key (id)
)

type 具有三个不同的值:WTWWAIV

以及对应的实体

@Entity
public class Person 
   String id;
   String type;

我使用 orm.xml 文件中的以下查询:

<named-query name="person.v">
  <query>
    select p
    from Person p
    where p.type = 'V'
  </query>
</named-query>

问题

当我通过 OpenJPA 提供的 EntityManager 运行它时,查询变为

select p.id, p.type
from PERSON p
where p.type = ? 

并且 OpenJPA 将值 "V" 作为参数传递。 type 以前的“常量”值现在是一个 SQL 参数。问题在于,对于char(3)type列,Oracle会存储

"V  "

这不等于 OpenJPA 作为参数传递的值。再说一遍:没有参数,即只使用我在 JPQL 中使用的 SQL 中的字符串,一切正常。

我假设 OpenJPA 执行此替换是为了通过规范化所有查询来最小化查询缓存,我知道这对很多人来说有很大的不同,但我认为这对我来说是个问题。

我现在的问题是:如何防止 OpenJPA 进行这种替换?我知道在运行时我不会有这个查询的不同排列。是否有我可以使用的配置属性或查询提示?

【问题讨论】:

快速更新:OpenJPA 如何处理准备好的语句中的char 类型没有错误。它只是无法处理列的数据类型,因为我们正在使用自定义 PreparedStatement 与实际 (Oracle) 语句的委托,以及 org.apache.openjpa.jdbc.sql,OracleDictionary (1, 2) 不起作用。 【参考方案1】:

除了将列更改为VARCHAR,我还有两个不太好的解决方法:

    将 JPQL 调整为 where p.type = 'V '(“V”后跟两个空格)。 使用 OpenJPA 不会优化的本机查询。

在 (1) 中,我知道底层的 char(3),而 JPQL 的想法是将其抽象出来,所以这有点违背使用 JPA 的想法。

对于 (2),我必须稍微重写这个简单的查询,但是为了避免我的持久性提供者的善意造成的问题,使用本机查询似乎并不正确。

【讨论】:

以上是关于如何防止 OpenJPA 替换查询中的“常量”参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 OpenJPA 中 FetchBatchSize 的数量?

参数化查询如何帮助防止 SQL 注入?

参数化查询如何帮助防止 SQL 注入?

带参数的查询防止SQL注入攻击

OpenJPA:JPQL 与本机查询

getResultList() 中的 IBM OpenJPA NullPointerException