如何防止OpenJPA取代"常数"我的查询中的参数?

时间:2015-07-20 12:41:40

标签: oracle jpa openjpa

当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"作为参数。之前的常数&#34; type的值现在是一个SQL参数。问题在于,对于char(3) type列,Oracle将存储

"V  "

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  1. 将JPQL调整为where p.type = 'V '(&#34; V&#34;后跟两个空格)。
  2. 使用原始查询,但不会被OpenJPA优化。
  3. 在(1)中,我知道底层的char(3),而JPQL的想法是将其抽象出来,所以这有点反对使用JPA的想法。

    使用(2)我必须稍微重写这个简单的查询,但是使用本机查询似乎不正确,以避免由我的持久性提供程序的良好意图所产生的问题。