具有 CHAR 类型的 JPA 查询.Was:使用 WHERE 和 EmbeddedId 的 JPA 查询



编辑:通过删除与问题无关的细节进行清理。

问题。JPA 查询不返回任何结果。

String qstr = "select o from MyStats o where o.queue_name = :queue"; 
String queue = "3";
em.createQuery(qstr).setParameter("queue", queue);

我认为问题要么出在 JPA 查询的语法不正确,要么出在 Embedded ID 的注释不正确上。因此,我发布了所涉及的类的定义,但除了它是 Oracle 之外,没有告诉数据库表。

我的测试代码:从数据库中读取,获取第一个值并在后续选择查询中重用该值,这意味着该记录存在。应该在那里,刚刚读过,对吧?

测试

String queue = ""; 
String qstr1 = "select o from MyStats o";
String qstr2 = "select o from MyStats o where o.queue_name = :queue"; 
logger.debug("SQL query: " + qstr1); 
List<MyStats> list = em.createQuery(qstr1).getResultList();
logger.debug("111 Returning results: " + list.size());
for (MyStats s : list) {
    queue = s.getQueue_name();
    logger.debug("Picking queue name: " + queue); 
    break;
}
logger.debug("SQL query: " + qstr2); 
list = em.createQuery(qstr2).setParameter("queue", queue).getResultList();
logger.debug("222 Returning results: " + list.size());

输出:

SQL query: select o from MyStats o
111 Returning results: 166
Picking queue name: 3
SQL query: select o from MyStats o where o.rec_id.queue_name = :queue 
222 Returning results: 0

类定义

@Entity
public class MyStats {
    private String queue_name;
    private long stats_id;
    ... //getters and setters
}

没有 WHERE 子句的查询可以正常工作,因此作为具有 MyStats 类成员的查询。

em.createQuery("select o from MyStats o where o.stats_id = :sid").setParameter("sid", 179046583493L);

我正在使用Oracle 10数据库,Java EE 5 SDK,Glassfish 2.1。

问题似乎出在 Java 字符串类型到数据库列 CHAR 类型的映射上。

数据库表queue_name列定义为 CHAR(20),而 Java 类型定义为字符串

修复

它的选择很少

  1. 将数据库列 CHAR 类型替换为 VARCHAR
  2. 为每个请求填充带有空格的查询参数值
  3. 使用 LIKE 条件代替等于 = 并将 % 添加到参数值的末尾
  4. 推测:使用演员表

(1) 如果您控制了数据库表,则可以接受

(2) 适用于给定的选择语句,可能中断 JOIN

(3)可能无法做到这一点。LIKE 'a%' 不仅返回 'a',还返回 'aa'、'abc '等

(4)这对我来说并不完全清楚。我不确定是否可以采用:

em.createNativeQuery("select cast(queue_name as CHAR(20)) from ..."); 

最新更新