CriteriaQuery список абстрактных классов

У меня есть классы Order, Article, Car

public class Order{
private List<Article> articles;
}

public abstract class Article{
private int id;
}

public class Car extends Article{
private String color;
}

public class Book extends Article{
private String title;
}

Как я могу проверить статьи, которые являются автомобилями, используя критерии запроса?

Заранее спасибо

1 ответ

Помните, что запросы являются полиморфными.

CriteriaQuery<Order> q = cb.createQuery(Order.class);
Root<Order> order = q.from(Order.class);
Join<Order,Article> article = order.join("articles", JoinType.LEFT);
q.select(order)
.where(cb.equal(article.type(), Car.class));

Вы можете ограничить тип классов, используя type() и подкласс, который вы только хотите получить.

Чтобы получить атрибут цвета, вы должны выполнить TypedQuery и выполнить итерацию по нему.

TypedQuery<Order> qw = em.createQuery(q);
List<Order> orderList = qw.getResultList();

от orderList.get(index).getArticles().get(indexOfArticles).getColor();

Для того, чтобы добавить пункт для автомобиля цвет.

CriteriaQuery<Order> q = cb.createQuery(Order.class);
Root<Order> order = q.from(Order.class);
Join<Order,Car> article = order.join("articles", JoinType.LEFT);
q.select(order)
.where(cb.equal(article.get("color"), "red"),cb.equal(article.type(), Car.class));
Другие вопросы по тегам