我将其发布在这里是因为我遇到了一个问题,但找不到解决该问题的方法。 我已经到处寻找解决方案,但是没有发现任何困扰我的地方。
对于我的项目,我正在使用休眠和Spring Boot。
我有以下课程:
A.java
@Entity
@Table(name = "a")
@Data
public class A implements Serializable {
private static final long serialVersionUID = 1L;
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "audit", cascade = CascadeType.ALL)
private List<AAD> aADs;
...
}
AAD.java
@Entity
@Table(name = "a_a_d")
@Data
public class AAD implements Serializable {
private static final long serialVersionUID = 1L;
...
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "b_id")
private B b;
...
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "A_id")
private A a;
}
B.java
@Entity
@Table(name = "b")
@Inheritance(strategy = InheritanceType.JOINED)
@Data
public class B implements Serializable {
private static final long serialVersionUID = 1L;
...
@Column(nullable = false, name = "price")
private Double price;
...
}
当我尝试在ARepositoryImpl
中请求某些信息而没有任何过滤条件时,
StringBuilder request = new StringBuilder("SELECT DISTINCT a FROM A a LEFT JOIN a.aADs aad LEFT JOIN aad.b b");
Query queryPhase1 = getEntityManager().createQuery(request.toString());
finalResult = queryPhase1.getResultList();
我对所有信息的预期结果都是如此:
- 0 = {A@18952}
_ id = {Long@19678} 2
...
_ aADs = {PersistentBag@1978} size = 2
- 0 = {B@12346}
- 1 = {B@25463}
_ id = {Long@123547} 1
...
_ price = {Double@125487} 17.0
- 1 = {A@5478}
...
- 2 = {A@1234}
...
但是,一旦我添加了一个过滤器,我就会得到一个空结果。那是我完全失去它的那一刻:(
StringBuilder request = new StringBuilder("SELECT DISTINCT a FROM A a LEFT JOIN a.aADs aad LEFT JOIN aad.b b WHERE b.price=17.0");
// I saw in the previous result that a B.price was equals to 17.0 so i try to filter on it so i obtain only my A objects which have a B.price = 17.0
// I should at least obtain {A@18952} in the reuslt of this query if i look my previous result
Query queryPhase1 = getEntityManager().createQuery(request.toString());
finalResult = queryPhase1.getResultList();
此外,它们没有错误,只是查询末尾的空白列表。我试图重新格式化查询并直接在aad上搜索(不使用左联接),但尝试此操作时出现解引用错误。
有人给我小费,或者回答让我畅通无阻,这真的是我的救星,因为我很快就会没头发了:/
感谢您的宝贵时间,对于冗长的帖子, 在这里,有这个sweet potato kiss
P.S .:我不认为这是另一篇文章的副本,因为我整个下午都在浏览它,如果我错了,我将非常感谢您的联系人员!
编辑
我将尝试使用一种变通方法来从头开始查询我的信息,我希望这会成功。我将首先在B
上进行过滤并获得ID的支持,然后借助这些ID搜索我的AAD
对象(以及我的A
对象)。
编辑2
我的解决方法实际上是按预期获取信息,只要我没有找到对上一种情况的任何解决方法,我就会保持一致。如果有人知道一些事情,请告诉我,我将不胜感激!