Использование спящего режима 3.6.10 с hibernate jpa 2.0.Решающие критерии по полиморфному атрибуту дочернего класса jpa hibernate query
Моя проблема сводится к необходимости устанавливать некоторые критерии в столбце дочернего объекта во время сложного соединения.
У меня есть набор объектов, подобных:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Ball
{
private String name;
//...getter and setter crud...
}
@Entity
public class BeachBall extend ball
{
private boolean atTheBeach;
//...getter and setter crud...
}
@Entity
public class SoccerBall extend ball
{
private int numberOfKicks;
//...getter and setter crud...
}
@Entity
public class Trunk
{
private Set<Ball> balls;
@OneToMany(mappedBy = "trunk", cascade = CascadeType.ALL, orphanRemoval = true)
public Set<Ball> getBalls()
{
return balls;
}
}
@Entity
public class Car
{
private Trunk trunk;
private String carModel;
//...getter and setter crud...
}
Теперь мне нужно запросить, сколько футбольные мячи имеют 20 ударов в автомобиле с конкретной моделью.
Использование JPA Я пытался сделать что-то вроде:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Car> criteriaQuery = criteriaBuilder.createQuery(Car.class);
Root<Car> car= criteriaQuery.from(Car.class);
Join<Car, Trunk> trunkJoin = car.join(Car_.trunk);
Join<Trunk, Ball> ballJoin = trunkJoin.join(Trunk_.Balls);
criteriaQuery.select(trunk);
Predicate [] restrictions = new Predicate[]{ criteriaBuiler.equal(car.get(carModel), "Civic"), criteriaBuilder.equal(ballJoin.get("numberOfKicks"), 20)};
criteriaQuery.where(restrictions);
TypedQuery<Car> typedQuery = entityManager.createQuery(criteriaQuery);
Car carWithSoccerBalls = typedQuery.getSingleResult();
Во время выполнения приведенный выше код умирает, потому что numberOfKicks только на soccerballs и из-за того, как его напечатал в багажнике он знает только мяч. Если я вручную создаю из soccerballs и критерии настройки, чтобы присоединиться к нему, я могу запросить numberOfKicks, однако я чувствую, что должен быть способ сообщить запрос, что набор фактически является множеством.
Обратите внимание, что я не могу опубликовать какой-либо код, поэтому все приведенные выше примеры - это просто примеры.
Использование JPA и спящего режима, как указано выше, есть способ заставить спящий режим знать, что набор < ball> на самом деле установлен < soccerball>?