ClassCastException при получении списка из базы данных с использованием Hibernate - PullRequest
0 голосов
/ 14 января 2019
@Id
@Column(name="Item", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int itemId;

@Column(name="ItemName")
private String itemName;

@Column(name="ItemPrice")
private double itemPrice;

@Column(name="status")
private String status;

@Column(name="image")
private String image;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "RestaurantId", nullable = false)
private Restaurant restaurant;

это мой класс сущностей,

public List<FoodItem> getFoodItems(Restaurant restaurant) {
    Session session=getSession();
    List<FoodItem> list=null;
    NativeQuery<?> query = session.createNativeQuery("SELECT " + 
            "   \"Item\"," + 
            "   \"ItemName\"," + 
            "   \"ItemPrice\"," + 
            "   \"RestaurantId\"," + 
            "   \"status\"," + 
            "   \"image\" " + 
            "FROM \"SYSTEM\".\"FoodItem\" where \"RestaurantId\"="+restaurant.getRestaurantId());
    list = (List<FoodItem>) query.getResultList();
    return  list;
}

когда я запускаю этот метод, он не возвращает мне List<FoodItem> вместо этого он возвращает List<Array>, как это,

[
[
    1,
    "Pasta",
    55,
    14,
    "Veg",
    null
],
[
    2,
    "Burger",
    35,
    14,
    "Veg",
    null
]
]

и если я пытаюсь установить для объекта ресторана значение NULL в каждом объекте в списке,

for(int index=0 ;index< list.size();index++)
        list.get(index).setRestaurant(null);

я получил ClassCastException. мне нужен ответ в ключе: значение пары в соответствии с моим классом сущности может кто-нибудь решить это для меня. Благодарю. [обновление] Решено!

Ответы [ 2 ]

0 голосов
/ 14 января 2019

NativeQuery имеет параметр ограниченного типа. Используйте его и передайте ожидаемый resultClass в качестве второго параметра для правильного общего разрешения, и вы получите ожидаемый результат.

NativeQuery<FoodItem> query = session.createNativeQuery("SELECT " + 
            "   \"Item\"," + 
            "   \"ItemName\"," + 
            "   \"ItemPrice\"," + 
            "   \"RestaurantId\"," + 
            "   \"status\"," + 
            "   \"image\" " + 
            "FROM \"SYSTEM\".\"FoodItem\" where \"RestaurantId\"="+restaurant.getRestaurantId(), 
            FoodItem.class);
List<FoodItem> list = query.getResultList();
return  list;
0 голосов
/ 14 января 2019

Предполагается получить список массивов объектов из собственного запроса. Он не будет создавать объекты типа из коробки для вас. Если вы хотите напечатать список, вам нужно сделать JPQL вместо собственного запроса.

List<Object[]> listResults = query.getResultList();

Перебирать список и составлять список типизированных объектов -

List<FoodItem> foodItems = new ArrayList();

for (Object[] record : listResults) {

       FoodItem item = new FoodItem();
       // set values from record, do necessary casts as well.

       foodItems.add(item);

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