在OneToOne Mapping中获取实体会返回错误的结果

时间:2016-04-13 08:50:19

标签: 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", referencedColumnName = "IDRESOURCE")
    private TranslationForSearch translation;

    // getters and setters

}

TranslationForSearch.java

@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
}

通常RESOURCE与N TRANSLATION(s)有关,而TRANSLATIONIDTRANSLATION标识,但是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(); 字段上。

这是我写的Criteria查询:

for (ResourceForSearch resourceForSearch : resultList) {
    if (resourceForSearch.getTranslation() != null)
        System.out.println("Resource id: " + resourceForSearch.getId() + " Language id: " + resourceForSearch.getTranslation().getLanguageId());
}

这里的问题是声明

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

打印

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)

查询中的提取似乎不起作用,因为查询返回的实体不遵守join子句。

编辑1: 这是Hibernate生成的SQL查询

SELECT resourcefo0_.IDRESOURCE AS IDRESOURCE1_2_,
  resourcefo0_.defaultText     AS defaultText6_2_,
  translatio1_.IDLANGUAGE
FROM WIN_RESOURCES resourcefo0_
LEFT OUTER JOIN WIN_TRANSLATIONS translatio1_
ON resourcefo0_.IDRESOURCE  =translatio1_.idResource
AND (translatio1_.IDLANGUAGE =22)

返回的行数等于WIN_RESOURCES的行数。此外,如果我编辑查询添加选择字段translatio1_.IDLANGUAGE,它返回值为22的null(不是30)。

    echo "# openshift-test23" >> README2.md
    git init

    #git add README2.md
    git add .
   git config remote.origin.url https://Username:password@github.com/Username/openshift-test
     #git commit --amend --reset-author
    git commit -a  -m "first commit"


    git remote add origin https://github.com/xxx/openshift-test.git
    git config remote.origin.url https://Username:password@github.com//openshift-test

    git push -u origin master

哪里可以出问题?

谢谢

0 个答案:

没有答案