2015-10-26 3 views
0

У меня возникли проблемы с переводом мягко сложного (~ 8 sloc) SQL-запроса на язык HQL.Сортировка ошибок пути соединения HQL

Я занимаюсь этим днем, к сожалению, примеры в Интернете слишком тривиальны, чтобы быть какой-либо помощью. Я уменьшил свой запрос до наименьшего образца, который все еще дает ошибку пути. Любые подсказки будут оценены.

SQL (работ)

SELECT container_modulelist 
FROM project.t_type 
INNER JOIN project.t_module ON project.t_type.module_id =project.t_module.id 
WHERE project.t_type.id = 111 

HQL (дает присоединиться к ошибке путь)

@Query(" 
select module.container_modulelist 
from Type type 
join Module module on type.module_id = module.id 
where type.id =111 
") 

Обновление: выше часть должна быть решена путем ответа ниже

Тем не менее, я до сих пор есть проблема, связанная с выполнением суб-запроса.

Я проверил раздел за пределами кронштейнов, и он отлично работает. Однако у меня возникла проблема с реализацией части в скобках (из приведенного ниже ответа), я бы хотел оценить суб-запрос и сравнить его, чтобы мой запрос возвращал значение, я видел, что это можно сделать с помощью HQL документация. В текущей форме суб-запрос не возвращается ни с чем, независимо от параметра. (?)

Эквивалент HQL (суб-запрос не работает):

@Query(" 
     select value from Value value 
      where value.type.module.containerModuleList = (
       select type.module.containerModuleList from Type type 
        where type.id =111) and value.name =yyy5 
") 
Value findOneByNameFromModuleList(@Param("id") Long id, @Param("name") String name); 

Рабочая часть:

@Query(" 
     select value from Value value 
      where value.type.module.containerModuleList = 1 and value.name =yyy5 
") 
Value findOneByNameFromModuleList(@Param("name") String name); 
+0

Got it. Мне не хватало аннотации в моем классе ресурсов. Таким образом, мои запросы не возвратили ничего найденного, когда у меня были оба параметра. Имел: 'Boolean isValueNameTaken (@PathVariable окончательного Длинный идентификатор, окончательное название String) публичное' Вместо: 'общественных Логическое isValueNameTaken (@PathVariable окончательного Длинного идентификатор, @PathVariable окончательного названия String)' – hardcore

ответ

1

HQL не использует имена таблиц и столбцов, но сущностей и полей/имена свойств , Вы не публикуете свои сущности, поэтому трудно ответить. Но ваш запрос, похоже, использует имена столбцов, или ваш Java-код вообще не соблюдает соглашения Java.

Кроме того, для объединений не требуется никаких условий on, поскольку вы используете ассоциации между сущностями для объединений, и поскольку эти ассоциации уже сопоставлены с JoinTable/JoinColumn, Hibernate знает, как таблицы должны быть объединены.

Таким образом, предполагается, что ваша сущность уважать Java именования, и что у вас есть ManyToOne связь между Type и Module лицами (т.е. есть поле module типа Module с аннотацией @ManyToOne в Type), запрос должен быть

select cml 
from Type type 
join type.module module 
join module.containerModuleList cml 
where type.id = 111 

Или просто

select type.module.containerModuleList from Type type where type.id = 111 

This is documented.

+0

Да, они делают уважение конвенций, я пытался его упростить. '@JoinColumn (name =" container_modulelist ", nullable = false) private ModuleList containerModuleList;' Это то, что у меня есть. Я получаю еще одну ошибку, 'Недопустимый путь: module.containerModuleList '' может быть, потому что здесь нет ключевого слова псевдонима модуля? – hardcore

+0

А, так что containerModuleList - это еще одна ассоциация. Я отредактировал запрос. –

+0

Спасибо, что я понял это с помощью этой помощи! – hardcore

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