Конкат JPQL и EclipseLink

Когда я объединяю поля в em.CreateQuery concat, возвращается NULL, потому что одно из моих полей может иметь NULL. Я хочу проверить NULL, как в функции Native MSSQL ISNULL (поле, 'что-то').

MyQuery есть.

entManager.createQuery("SELECT NEW " + ThumbNail.class.getName() + "(p.id,p.thumbnail,p.thumbNailModifiedDate, CONCAT(p.firstName,' ',p.lastName,' ',p.middleName)) FROM Person p").setHint("eclipselink.refresh", "true").getResultList();   

Этот тоже пробовал

entManager.createQuery("SELECT NEW " + ThumbNail.class.getName() + "(p.id,p.thumbnail,p.thumbNailModifiedDate, CONCAT(FUNC('ISNULL',p.firstName,''),' ',FUNC('ISNULL',p.lastName,''),' ',FUNC('ISNULL',p.middleName,'')) FROM Person p").setHint("eclipselink.refresh", "true").getResultList();

И это не сработало


person Emin Javadov    schedule 29.11.2012    source источник
comment
Если вы используете нативную функцию, вы можете использовать нативный запрос -> entManager.createNativeQuery("Native SQL"); Eclipselink и JPA в целом довольно хорошо обрабатывают нули, поэтому я не видел вашей проблемы, но если для этого есть веская причина, нативные запросы просты, если не переносимы.   -  person Daniel B. Chapman    schedule 29.11.2012
comment
Спасибо за ответ. Но я не мог сделать это с собственным запросом, потому что p.thumbnail - это мой класс ресурсов. Я пробовал это с родным Query. вот. Скопировал его из журнала и изменил на: entManager.createNativeQuery(SELECT t0.ID, t1.ID, t0.THUMB_NAIL_ID, t1.CREATION_DATE, t1.FROM_MODULE, t1.CHANGE_DATE, t1.RESOURCE_BYTE, t1.DIGEST, t1.RESOURCE_TYPE, t0 .MODIFIED_DATE, ISNULL(t0.FIRST_NAME,'') + ' ' + ISNULL(t0.LAST_NAME,'') + ' ' + ISNULL(t0.MIDDLE_NAME,'') FROM INTERDIR_PERSON t0 LEFT OUTER JOIN INTERDIR_RESOURCES t1 ON (t1. ID = t0.THUMB_NAIL_ID),ThumbNail.class).getResultList(); Выросла ошибка.   -  person Emin Javadov    schedule 29.11.2012
comment
Func был добавлен в Eclipselink 2.1, поэтому его нельзя использовать в EL 2.0.1, о котором вы упоминали ниже. Он заменен на FUNCTION в EclipseLink 2.4 для спецификации JPA 2.1: wiki.eclipse.org/EclipseLink/UserGuide/JPA/   -  person Chris    schedule 30.11.2012
comment
Могут ли возникнуть конфликты с другими запросами при переходе на более позднюю версию EclipseLink?   -  person Emin Javadov    schedule 30.11.2012


Ответы (3)


JPQL поддерживает функцию объединения, которая возвращает первый из своих ненулевых аргументов. Таким образом, вы могли бы использовать

CONCAT(coalesce(p.firstName, ''), 
       ' ', 
       coalesce(p.lastName, ''),
       ' ',
       coalesce(p.middleName, ''))

Я бы поставил отчество в середине, а не в конце.

person JB Nizet    schedule 29.11.2012
comment
Кажется, JPA не поддерживает использование вложенных функций JPQL. EclipseLink версии 2.0.1, GlassFish V3 - person Emin Javadov; 29.11.2012
comment
публикуя исключение и пробуя более позднюю версию EclipseLink в Glassfish. blogs.oracle.com/GlassFishPersistence/entry/ - person Chris; 30.11.2012

РЕШЕНО! Но не с функциями JPQL.

Я просто добавил новый конструктор в свой объект pojo и заполнил его JPQL, а затем объединил его с проверкой на нуль. Спасибо ребята за ответы.

person Emin Javadov    schedule 30.11.2012

изменение запроса jpa - это беспорядок...

просто добавьте метод notNull:

private String notNull(String input){ if (input != null) { return input.trim(); } return ""; }

и поместите это на каждый установщик (String) в вашем Entity-Class

setFirstName(String name) { this.name = notNull(name) }

так что все ваши "нули" получают "" и jpa работает

НО: тогда для db-nulls вы получите String="", так что имейте в виду..

person Bernhard    schedule 30.10.2015