2010-12-15 2 views
3

Я, кажется, не найти ответа на Somthing, что я не принимать, как «не представляется возможным» :)ВЫБРАТЬ NEW() со многими однозначном коллекции внутри конструктора - HQL

Вот мой HQL query: «SELECT new TestTable (t.id, t.param1, t.param2, t.param3, stps) FROM TestTable t left join t.steps как stps WHERE t.someObj.id IN (: someObjIds)"

TestTable имеет следующий consturtor: public TestTable (Integer param1, Integer param2, Date param3, Date param4, Set steps)

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

в запросе я также попытался использовать LEFT JOIN выборки t.steps, пытался без LEFT JOIN вообще, пытались окружить параметр «ТПС» в конструкторе с «элементами», как это: элементы (ТПС)

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

любые идеи кто-нибудь ??? (btw, меня зовут Tomer)

+1

, пожалуйста, отформатируйте код, приведенный ниже, с подсказками редактора справа – bluish 2010-12-15 08:42:12

ответ

4

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

Этот запрос возвращает t.id, t.param1, t.param2, t.param3, [one entity from steps table] на каждой строке и дублирует ваши результаты из-за левой ссылки на таблицу шагов.

Моя рекомендация, во-первых, создайте запрос, который получает данные из 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); 
} 
2

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