2013-09-12 2 views
2

Использование спящего режима 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>?

ответ

2

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

Для того, чтобы критерии апи признать, что я «Я искал унаследованную таблицу, я изменил свой код запроса:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Car> criteriaQuery = criteriaBuilder.createQuery(Car.class); 
    Root<Car> car= criteriaQuery.from(Car.class); 
    Root<Soccerball> soccerballs = criteriaQuery.from(SoccerBall.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(soccerball.get("numberOfKicks"),20), criteriaBuilder.equal(soccerball.get(SoccerBall_.id),car.get(Car_.id))}; 
    criteriaQuery.where(restrictions); 
    TypedQuery<Car> typedQuery = entityManager.createQuery(criteriaQuery); 
    Car carWithSoccerBalls = typedQuery.getSingleResult(); 
Смежные вопросы