2014-09-18 2 views
0

Я использую spring-batch и JpaPagingItemReader<T> для чтения БД до @Entity. Объект правильно указан как аргумент типа T.JpaPagingItemReader, не создающий объекты объекта

Задача: Возвращаемый результат не относится к типу T, но массив объектов: Object[]. Каждый объект в этом массиве представляет собой массив Object[], имеющий следующий контент: [firstname, lastname, date].

Итак, столбцы базы данных как-то написаны как массивы String, и сущности возвращаются, очевидно, как массив String[].

Причиной этого является мой запрос:

SELECT firstname, lastname, min(date) FROM mytable GROUP BY firstname, lastname; 

, так что читатель карты в массив строк. Как я могу сопоставить с моим @Entity, возможно, только заполненными полями, запрошенными в выборе?

Мое определение читателя:

JpaPagingItemReader<MyEntity> reader = new JpaPagingItemReader<>(); 
reader.setEntityManagerFactory(emf); 
reader.setQueryString(QUERY); 

@Entity 
public class MyEntity { 
    private String firstname, lastname; 
    private Date date; 

    public MyEntity(String firstname, String lastname, Date date) { 
     this.firstname = firstname; 
     this.lastname = lastname; 
     this.date = date; 
    } 
} 
+0

Вы можете показать свой боб определение читатель? – ccheneson

+0

Извините, что забыл добавить мой запрос, что, вероятно, является причиной ... – membersound

+0

Разве это не использование JPQL с JpaPagingItemReader? Добавлено определение читателя выше. Из документов: 'Он выполняет JPQL {@link #setQueryString (String)} для получения запрошенных * data.' – membersound

ответ

1

Попробуйте

SELECT m FROM mytable m GROUP BY m.firstname, m.lastname; 

Это должно вернуть объект

Вот пример декларативный способ определения читателя:

<beans:bean id="myreader" 
    class="org.springframework.batch.item.database.JpaPagingItemReader"> 
    <beans:property name="queryString" 
     value="SELECT m FROM mytable m GROUP BY m.firstname, m.lastname" /> 
    <beans:property name="entityManagerFactory" ref="entityManagerFactory" /> 
</beans:bean> 

Edit:

От M.Deinum комментарий, вы должны быть в состоянии использовать это:

SELECT new com.myproject.model.MyEntity(firstname, lastname, min(date)) FROM mytable GROUP BY firstname, lastname 
+0

Ошибка: 'Столбец m. * Должен произойти в предложении GROUP-BY или использоваться в агрегированной функции' (бесплатный перевод с выхода на родном языке. – membersound

+0

Отлично! Новый оператор действительно работает. Правильно ли это сделать? – membersound

+0

Если вы хотите вернуть подмножество своего лица, да, но поскольку у вас всего 3 атрибута в вашей сущности, это нормально. Если у вас есть 20 атрибутов в вашей сущности, и вам нужно вернуть только несколько, вам лучше пойти с новым POJO - см. Http://stackoverflow.com/questions/2355728/jpql-create-new-object-in-select-statement-avoid-or-embrace – ccheneson

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