SELECT NEW () с коллекцией многие-к-одному внутри конструктора - HQL - PullRequest
4 голосов
/ 15 декабря 2010

Мне кажется, что я не могу найти ответ на что-то, что я отказываюсь принять как "Невозможно":)

Вот мой HQL-запрос: «ВЫБЕРИТЕ новую TestTable (t.id, t.param1, t.param2, t.param3, stps) ОТ TestTable t оставьте соединение t.steps как stps ГДЕ t.someObj.id IN : someObjIds) "* ​​1003 *

TestTable имеет следующий константор: общедоступная TestTable (целочисленный параметр1, целочисленный параметр2, дата параметрический 3, дата параметрический 4, шаги набора)

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

в запросе я также пытался использовать выборку из левого соединения t.steps, пытался вообще без левого соединения, пытался окружить параметр "stps" в конструкторе "элементами", такими как: elements (stps)

но ничего не получалось ... причина, по которой я это делаю, состоит в том, что TestTable очень большой и имеет много столбцов и ассоциаций, но в этом случае я хочу только 4 столбца и одну коллекцию. когда один запрос может вернуть до 400 000 объектов, это становится ненужным.

есть идеи кто-нибудь ??? (кстати, меня зовут Томер)

Ответы [ 2 ]

4 голосов
/ 16 января 2012

Вы не можете использовать выражение пути с коллекцией в выражении конструктора. Следуйте ответ

4 голосов
/ 15 декабря 2010

Ваш запрос может работать без конструктора 'new', но он не дает того, что вы ожидаете.

Этот запрос возвращает t.id, t.param1, t.param2, t.param3, [один объект из таблицы шагов] на каждой строке и дублирует ваши результаты благодаря левому соединению с таблицей шагов.

Я рекомендую сначала создать запрос, который получает данные из TestTable. Что-то вроде

List<TestTable> resultList = "select new TestTable(t.id,t.param1,t.param2,t.param3) from TestTable where
                      t.someObj.id in (:someObjId)"

Затем создайте запросы, которые получают данные из таблицы шагов для каждой TestTable.

for (TestTable tt : resultList) {
    List<Steps> stepList = "select st from Steps st where st.testTable.id = :ttId";
    tt.setSteps(stepList);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...