【发布时间】:2020-06-19 19:18:29
【问题描述】:
可能是重复的问题,但我无法为我的案例找到解决方案,我认为这很简单。
我有两张这样的桌子:
这些是相关的 DTO 对象:
第一张桌子
@Entity
@Table(name = "DA10003_REF_SIGNALEMENT")
public class RefSignalement {
@Id
@Column(name = "CD_SIGNALEMENT")
public String codeSignalement;
@Column(name = "LIBELLE")
public String libelle;
@Column(name = "CATEGORIE")
public String categorie;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "CD_SIGNALEMENT")
public List<RefMessage> refMessages;
}
第二张桌子:
@Entity
@Table(name = "DA10004_REF_MESSAGE")
public class RefMessage {
@Id
@Column(name = "CD_SIGNALEMENT")
public String codeSignalement;
@Id
@Column(name = "DESTINATAIRE")
public String destinataires;
@Column(name = "MESSAGE")
public String message;
}
以下查询可获取所有 RefSignelement 以及相关消息:
List<RefSignalement> listRefSignalement = em.createQuery("SELECT p FROM RefSignalement p, RefMessage m", RefSignalement.class).getResultList();
不幸的是它返回了一个空列表,我尝试用join fetch 更改它,但没有任何改变。
感谢您的帮助
【问题讨论】:
-
什么列表是空的,如果它是 RefSignalement 实例的列表,你如何检查数据库中有没有?将测试指向可能为空的错误测试数据库是一个常见错误。这个查询也是错误的,所以如果你有结果,你会为数据库中的每个 RefMessage 实例获得重复的 RefSignalement - 你将 RefMessage m 添加到 from 子句中,但没有将它与 RefSignalement p 关联起来。
-
@Chris 我对对象实体和代码进行了一些更改,现在它可以工作了,但是正如你提到的,我得到了重复的 RefSignalement,所以我尝试了这个查询
SELECT s FROM RefSignalement s JOIN FETCH s.refMessages,结果是一样的为每个实例获取多个对象,如果 RefSignalement 在 RefMessage 中没有相关数据,则它根本不会出现 -
我已经将 DISTINCT 添加到查询中,它以某种方式解决了问题,但是当我在我的数据库中添加数据时,结果并没有改变我的行为真的很奇怪
-
DISTINCT 对我来说没有意义,但如果它有效,那就太好了,但应该会导致更少的结果而不是更多。如果您要加入某些内容并希望包含空值,则应该使用 LEFT OUTER JOIN