如何防止 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
具有三个不同的值:WTW、WAI、V
以及对应的实体
@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 替换查询中的“常量”参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章