отображение списка из JPA Query.getResultList () в настроенное TO - PullRequest
4 голосов
/ 31 октября 2011

У меня есть таблица fruit с четырьмя столбцами id, name, color, shape.

записей в таблице будут:

1, apple, red, round
2, banana, yellow, long
3, tomato, red, round
4, orange, orange, round

Теперь я создал класс сущности Fruit, сопоставленный сТаблица выше.

@Entity
@Table(name="fruit")
public class Fruit implements Serializable {

@Id
@Column(name="ID")
String id;

@Column(name="NAME")
String name;

@Column(name="COLOR")
String color;

@Column(name="SHAPE")
String shape;

//getters/setters goes here
}

В моем классе DAO код:

String myQuery = "Select f.shape, f.name from Fruit f where f.shape = :shape";
Query query = this.em.createQuery(myQuery);
query.setParameter("shape", "round");

Как очевидно, выполнение запроса выше вернет 3 строки.

У меня есть простой класс TO FruitSearchTO

class FruitSearchTO
{
  String shape;
  String name;

  //getters/setters here
}

Это TO соответствует строкам, возвращаемым моим запросом.

Но в моем DAO выполняется что-то вроде:

List<FruitSearchTO> fruitList = new ArrayList<FruitSearchTO>();  
fruitList = query.getResultList();

вызывает исключение java.lang.ClassCastException: [Ljava.lang.Object;несовместим с FruitSearchTO]

Куда я иду не так и как это можно решить?

Ответы [ 2 ]

6 голосов
/ 31 октября 2011

Используемый вами HQL вернет List<Object[]>, каждый элемент List представляет собой массив с shape в позиции 0 и name в позиции 1.

Вы можете сделатьHQL возвращает List<FruitSearchTO>, используя AliasToBeanResultTransformer:

List fruitList = s.createQuery(
  "select f.shape as shape, f.name as name from Fruit f where f.shape = :shape;")
  .setParameter("shape", paramShape)
  .setResultTransformer( Transformers.aliasToBean(FruitSearchTO.class))
  .list();
FruitSearchTOdto = (FruitSearchTO) fruitList .get(0);

В качестве альтернативы, если FruitSearchTO имеет соответствующий конструктор:, вы также можете достичь этого с помощью select new FruitSearchTO(f.shape, f.name).

Посмотрите главу Hibernate Reference по HQL, в частности 15.6. select условие , глава.

4 голосов
/ 01 ноября 2011

В JPQL у вас есть оператор NEW, который позволяет вам создавать экземпляр объекта на лету, который не должен быть самим объектом (как в вашем случае - DTO не является объектом)).

Если вы не хотите использовать решение для конкретного поставщика, вы можете использовать оператор NEW или просто перебрать получившийся объект [] и создать свой DTO самостоятельно.

Это можетбыть интересными материалами для вас: Как можно избежать создания лишних сущностей? и немного об операторе NEW .

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