2014-11-04 2 views
1

В Spring MVC приложения, используя спящий режим и MySQL, я написал следующий метод запроса возвращает список имен с пациентами:jpql остался присоединиться выборки не возвращать результаты для как

@SuppressWarnings("unchecked") 
public Collection<Person> findPersonByLastName(String ln) throws DataAccessException{ 
    Query query = this.em.createQuery("SELECT DISTINCT pers FROM rimPerson pers left join fetch pers.names nm WHERE nm.family LIKE :lnm"); 
    query.setParameter("lnm", ln); 
    return query.getResultList(); 
} 

Это производит следующее спящий режим SQL:

Hibernate: 
select distinct 
person0_.hppid as hppid1_340_0_, 
names1_.HJID as HJID1_89_1_, 
person0_2_.classCode_HJID as classCod2_339_0_, 
person0_1_.administrativeGenderCode_HJID as administ2_341_0_, 
person0_1_.birthTime_HJID as birthTim3_341_0_, 
names1_.DELIMITER_ as DELIMITE2_89_1_, 
names1_.FAMILY as FAMILY3_89_1_, 
names1_.named_entity_hppid as named5_89_1_, 
names1_.SUFFIX as SUFFIX4_89_1_, 
names1_.name_entity_HJID as name9_340_0__, 
names1_.HJID as HJID1_89_0__ 
from 
rim_person person0_ inner join rim_living_subject person0_1_ on person0_.hppid=person0_1_.hppid 
inner join rim_entity person0_2_ on person0_.hppid=person0_2_.hppid 
inner join rim_infrastructure_root person0_3_ on person0_.hppid=person0_3_.hppid 
left outer join EN names1_ on person0_.hppid=names1_.name_entity_HJID 
where names1_.FAMILY like ? 

Когда я вызвать выше метод jpql с помощью следующей команды, она возвращает нулевой результат:

this.myappService.findPersonByLastName(""); 

Я также получаю нулевые результаты, когда я вырезал и пропустил выше сгенерированный спящий код в клиенте командной строки MySQL и заменил ? на ''.

Если, однако, я удаляю where names1_.FAMILY like ? из сгенерированного спящего режима sql выше и помещаю сокращенный sql в клиент командной строки MySQL, я получаю четыре результата, каждый из которых имеет значение для поля lastname.

Как изменить jpql так, чтобы он генерировал запрос на спящий режим, который возвращает четыре результата, когда `` передается как пустой параметр строки? Я хочу, чтобы результирующий набор включал каждый результат, когда пользователь вводит пустой ввод, но дает отфильтрованные результаты, когда пользователь вводит данные в любом заданном текстовом вводе.

ответ

1

Типичная причина, по которой like не может сделать то, что, по вашему мнению, должно сделать, - это забыть поместить шаблон в строку шаблона. Например, если вы хотите совместить все имена пользователей, начинающиеся с «Код», вы должны сделать что-то вроде name like 'Code%', NOT name like 'Code'. Вы можете точно контролировать то, что соответствует вашему предикату, с тщательным размещением в вашей строке %.

Попробуйте посмотреть все объекты независимо от того, какое значение в семье:

this.myappService.findPersonByLastName("%"); 

Это своего рода сырный иметь вызывающий findPersionByLastName должны поставить в % шаблона. Лучшая реализация заключается в том, чтобы вызывающий абонент указывал, какую фамилию они ищут, а затем код, который создает запрос, помещает шаблон в нужное место. Когда вы ищете фамилии, вы могли бы сделать что-то вроде этого:

query.setParameter("lnm", "%" + ln); 

Это будет соответствовать все, что заканчивается с параметром, который передается методе.

+0

Следующие действия: 'query.setParameter (« lnm », ln +«% »);' Я не использовал ваш код, потому что я хочу, чтобы это было изолировано в репозитории, чтобы максимизировать повторное использование. Но я даю +1 и благодарю за ответ, потому что ты указал мне в правильном направлении. Спасибо. – CodeMed

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