gpt4 book ai didi

java - 解析多态子类属性jpa hibernate查询的标准

转载 作者:搜寻专家 更新时间:2023-11-01 02:47:31 25 4
gpt4 key购买 nike

将 hibernate 3.6.10 与 hibernate 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 只在 soccerballs 上,并且由于它在 Trunk 中的输入方式,它只知道球。如果我在 soccerballs 上手动创建一个 from 并设置加入它的条件,我可以查询 numberOfKicks,但是我觉得必须有一种方法来通知查询该集合实际上是一个集合。

请注意,我无法发布任何实际代码,因此以上所有示例都只是示例。

像上面那样使用 JPA 和 hibernate 是否有办法强制 hibernate 知道 set 实际上是 set

最佳答案

由于时间限制,我选择了简单的出路:(。如果有人能比我的回答更好,我会很乐意选择他们的答案而不是我的。

为了使标准 api 识别我正在寻找继承的表,我将查询代码更改为:

   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();

关于java - 解析多态子类属性jpa hibernate查询的标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18769606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com