Java 在OneTONE映射中获取实体会返回错误的结果

Java 在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

我有这个

ResourceForSearch.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
}
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,翻译表中只有一个元组。