将休眠 3.6.10 与休眠 jpa 2.0 一起使用。
我的问题归结为在有点复杂的连接查询期间需要在子对象的列上设置一些标准。
我有一组类似的对象:
@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 只在足球上,并且由于它在 Trunk 中的键入方式,它只知道球。如果我在足球上手动创建一个从并设置标准加入它,我可以查询 numberOfKicks,但是我觉得必须有一种方法来通知查询该集合实际上是一个集合。
请注意,我无法发布任何实际代码,因此以上所有示例都只是示例。
像上面那样使用JPA和hibernate有没有办法强制hibernate知道set<ball>实际上是set<soccerball>?