Использование HibernateTemplate.find (...) со строкой [] - PullRequest
0 голосов
/ 23 ноября 2011

У меня снова проблемы с HQL :(

Мой желаемый SQL такой:

select employee.idemployee as id, employee.age as age,     
employee.birthday as birthday, employee.firstName as firstName, 
employee.gender as gender, employee.lastName as lastName from employee 
employee
inner join employee_skillgroups skillgroup1 on 
employee.idemployee=skillgroup1.idemployee
inner join employee_skillgroups skillgroup2 on
employee.idemployee=skillgroup.idemployee
where skillgroup1.idskillgroup =  'Sprachen'
and skillgroup.idskillgroup = 'SoftSkills'

Но я просто не могу заставить HQL сгенерировать мне это ... «Sprachen» и «SoftSkills» - это две строки, выходящие из строки [], которую я даю методу в качестве параметра. В настоящее время метод выглядит следующим образом:

public List<Employee> findEmployeeWithTwoSkillGroups(final String[] skillGroups) {
return template.find("from Employee e join e.skillGroups as s where s in ?", Arrays.asList(skillGroups).toString
    ().substring(1, Arrays.asList(skillGroups).toString().length()-1));
}

Я "приводил" массив к списку, выполняю toString() над ним (поэтому я получаю "[Sprachen, SoftSkills]") и обрезаю первый и последний символ (поэтому я получаю "Sprachen, SoftSkills") .
Я предполагаю, что проблема в том, что HQL генерирует "[...]. Idskillgroup in ('Sprachen, SoftSkills')", как будто он обрабатывает две строки как ОДНУ строку ...
И я просто не могу заставить его работать так, как я хочу: /

Может кто-нибудь помочь мне и дать подсказку, что делать дальше / делать? :-)

Greetz gilaras

Simmilar вопрос:

HQL для получения элементов, которые обладают всеми предметами в наборе

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Правильный оператор HQL должен выглядеть примерно так:

from Employee e join e.skillGroups as s where s in ( 'Foo', 'Bar', 'Baz' )

, поэтому вам не хватает '' для каждого слова.

РЕДАКТИРОВАТЬ: Теперь, когда я получил то, что вы хотитечтобы достичь здесь: -)

Я бы порекомендовал вам сделать это:

Query query = session.createQuery(
     "from Employee e join e.skillGroups as s where s in (:skillGroups)");
// skillGroups must be a Collection type
query.setParameterList("skillGroups", skillGroups); 
List list = query.list();

В случае, если вам нужен результат, равный AND всех элементов вашего массива String[],Вы можете сделать следующее:

Query query = session.createQuery(
     "from Employee e join e.skillGroups as s where s in (:skillGroups) group by e having count(s) = :skillGroupsLength");
query.setParameterList("skillGroups", skillGroups);
query.setParameter("skillGroupsLength", skillGroups.length);
List list = query.list();
0 голосов
/ 23 ноября 2011

Это подготовленное утверждение, а не конкатенация строк. Он обрабатывает ('Sprachen, SoftSkills') как одну строку, потому что является одной строкой. Вы хотите вставить коллекцию в свой запрос. Я не уверен, как это сделать в hibernateTemplate, но сама hibernate поддерживает добавление коллекции. см. документацию по спящему режиму .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...