涉及 @ManyToOne 关系的 Hibernate 查询

问题描述 投票:0回答:1

我有一个类声明为

@Entity
@Table(name = "word", schema = "public")
public class Word implements java.io.Serializable {
    ...
    private ContentLanguage contentLanguage;
    ...
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "content_language_id", nullable = false)
    public ContentLanguageT getContentLanguage() {
        return this.contentLanguage;
    }

    public void setContentLanguage(ContentLanguage contentLanguage) {
        this.contentLanguage = contentLanguage;
    }
    ...

ContentLanguage 声明为

@Entity
Table(name = "content_language", schema = "public")
class ContentLanguage implements java.io.Serializable {

    private int id;
    private String value;
    ....

我的操作需要查询 ContentLanguage 字段的 id = 1 的所有单词 我想我也许能够针对 ContentLanguage 类创建一个条件,然后将其添加到针对 Word 表的条件中,但显然这不是这样做的方法。 有什么想法,因为我不想开始使用 SQL 或 HQL 来完成相对简单的任务?

public String execute() {       
    //DetachedCriteria criteria1 = DetachedCriteria.forClass(ContentLanguageT.class);
    //criteria1.add(Restrictions.eq("id",1));
    DetachedCriteria criteria = DetachedCriteria.forClass(WordT.class);
    //criteria.add( criteria1 );
    criteria.add(Restrictions.eq("contentLanguageT", Integer.valueOf( contentLangID )));        
    allWords = wordDao.findByCriteria( criteria, 0, 50);        
    return SUCCESS;
}
java hibernate
1个回答
2
投票

Word.contentLanguage
属于
ContentLanguage
类型。所以你不能将它与整数进行比较。您只能将其与 ContentLanguage 进行比较。所以,要么你做

criteria.add(Restrictions.eq("contentLanguage.id", contentLanguageId));

或者你做

criteria.add(Restrictions.eq("contentLanguage", 
                             session.load(ContentLanguage.class, contentLanguageId)));

对于这种简单的静态查询,我真的更喜欢 HQL。下面的内容是不是更易读、更直观?

select w from Word w 
where w.contentLanguage.id = :contentLanguageId
© www.soinside.com 2019 - 2024. All rights reserved.