我有这个实体
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)有关,而TRANSLATION
由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();
字段上。
这是我写的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
哪里可以出问题?
谢谢