2013-09-13 4 views
1

Редактировать: Очистка путем удаления деталей, не имеющих отношения к проблеме.JPA запрос с типом CHAR. Был ли: запрос JPA с WHERE и EmbeddedId

Проблема. Запрос 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 
} 

Запрос без ГДЕ предложение работает правильно, так как запрос с членом класса 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.

+1

Я уже два дня борюсь с этой проблемой. Да, это может быть из-за глупой ошибки с моей стороны, но это не так, как будто я просто решил бросить это на сообщество. ** Если вы хотите уменьшить этот вопрос и уменьшить мои шансы получить ответ, пожалуйста, найдите момент, чтобы указать причину. ** Это даст мне шанс ** улучшить вопрос. Спасибо. – dmitri

ответ

0

Проблема заключалась в сопоставлении типа строки Java с типом столбца базы данных CHAR.

базы данных столбец таблицы queue_name определяется как CHAR (20), в то время как тип Ява Строка.

Есть несколько вариантов, чтобы исправить это

  1. Заменить столбец базы данных типа CHAR с VARCHAR
  2. Pad значения параметра запроса с пробелами для каждого запроса
  3. Использования LIKE условия вместо равноправных = и добавьте% к конец значения параметра
  4. Спекулятив-: Использование литой

(1) Приемлемо, если у вас есть контроль над таблицей базы данных

(2) Работы для данного оператора выбора, possibly breaks for JOINs

(3) может не сделать трюк.LIKE 'a%' возвращает не только 'a', но 'aa', 'abc' и т. Д.

(4) Это мне не совсем понятно. Я не уверен, что можно принять:

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

 Смежные вопросы

  • Нет связанных вопросов^_^