Java 在OneTONE映射中获取实体会返回错误的结果
我有这个 ResourceForSearch.javaJava 在OneTONE映射中获取实体会返回错误的结果,java,hibernate,jpa,Java,Hibernate,Jpa,我有这个 ResourceForSearch.java @Entity @Table(name = "RESOURCES") public class ResourceForSearch { @Id @Column(name = "IDRESOURCE") private long id; private String defaultText; @OneToOne @JoinColumn(name = "IDRESOURCE", refere
@Entity
@Table(name = "RESOURCES")
public class ResourceForSearch {
@Id
@Column(name = "IDRESOURCE")
private long id;
private String defaultText;
@OneToOne
@JoinColumn(name = "IDRESOURCE", referencedColumnName = "IDRESOURCE")
private TranslationForSearch translation;
// getters and setters
}
@Entity
@Table(name = "TRANSLATIONS")
public class TranslationForSearch {
@Column(name = "IDTRANSLATION")
private long id;
@Column(name = "IDLANGUAGE")
private long languageId;
private String translation;
@Id
private long idResource;
// getters and setters
}
TranslationForSearch.java
@Entity
@Table(name = "RESOURCES")
public class ResourceForSearch {
@Id
@Column(name = "IDRESOURCE")
private long id;
private String defaultText;
@OneToOne
@JoinColumn(name = "IDRESOURCE", referencedColumnName = "IDRESOURCE")
private TranslationForSearch translation;
// getters and setters
}
@Entity
@Table(name = "TRANSLATIONS")
public class TranslationForSearch {
@Column(name = "IDTRANSLATION")
private long id;
@Column(name = "IDLANGUAGE")
private long languageId;
private String translation;
@Id
private long idResource;
// getters and setters
}
通常,资源
与N翻译
(s)相关,翻译
由IDTRANSLATION
标识,但为TRANSLATIONS.IDLANGUAGE
指定一个值,此关系变为OneToOne
,因为在某种语言中(由IDLANGUAGE
标识)每个资源只有一个翻译(资源是我想用不同语言翻译的标签)
因此,仅出于搜索目的,我可以将@Id
注释放在TranslationForSearch.idResource
字段上,而不是TranslationForSearch.Id
字段上
以下是我编写的条件查询:
CriteriaQuery<ResourceForSearch> searchQuery = criteriaBuilder.createQuery(ResourceForSearch.class);
Root<ResourceForSearch> searchRoot = searchQuery.from(ResourceForSearch.class);
searchQuery.select(searchRoot);
Join<ResourceForSearch, TranslationForSearch> translationJoin = resourceRoot.join("translation", JoinType.LEFT);
// Here I filter the JOIN clause by language id, having the OneToOne relationship
translationJoin.on(criteriaBuilder.equal(translationJoin.get("languageId"), 22));
// Here I want to fetch the TRANSLATIONS included in the join
resourceRoot.fetch("translation");
List<ResourceForSearch> resultList = em.createQuery(searchQuery).getResultList();
印刷品
Resource id: 81 Language id 22
Resource id: 85 Language id 30
Resource id: 86 Language id 30
Resource id: 87 Language id 30
Resource id: 88 Language id 30
查询中的fetch似乎不起作用,因为查询返回的实体不符合join子句
编辑1:
这是由Hibernate生成的SQL查询
SELECT resourcefo0_.IDRESOURCE AS IDRESOURCE1_2_,
resourcefo0_.defaultText AS defaultText6_2_
FROM WIN_RESOURCES resourcefo0_
LEFT OUTER JOIN WIN_TRANSLATIONS translatio1_
ON resourcefo0_.IDRESOURCE =translatio1_.idResource
AND (translatio1_.IDLANGUAGE =22)
它返回的行数等于WIN_资源的行数。此外,如果我添加select字段TRANSTALIO1_U1.IDLANGUAGE编辑查询,它将返回22的null值(不是30)
问题出在哪里
谢谢如果这是一对一的关系,那么为什么多个资源被标记为一种语言?说一些不尊重join子句的话意味着您实际上已经查看了生成的SQL。你有,不是吗?@PrasadKharkar:因为对于单个资源和单个语言Id,翻译表中只有一个元组。