2

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

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

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

我认为问题出在 JPA 查询的语法不正确或 EmbeddedID 的注释不正确。因此,我发布了所涉及的类的定义,但除了它是 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。

4

1 回答 1

0

问题似乎与 Java String 类型到数据库列 CHAR 类型的映射有关。

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

修复它的选项很少

  1. 用 VARCHAR 替换数据库列 CHAR 类型
  2. 用空格为每个请求填充查询参数值
  3. 使用 LIKE 条件而不是 equals = 并将 % 添加到参数值的末尾
  4. 投机:使用演员表

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

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

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

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

em.createNativeQuery("select cast(queue_name as CHAR(20)) from ..."); 
于 2013-09-17T03:46:56.493 回答