【问题标题】:Hibernate Criteria: How to retrieve table data with foreign key relationshipHibernate Criteria:如何检索具有外键关系的表数据
【发布时间】:2014-10-27 09:01:17
【问题描述】:

我有两个名为 Document 和 DocumentUser 的 pojo 类。 DocumentUser 有一个属性 documentId,它通过外键链接到 Document 的 id。 因此,我想创建标准查询,该查询使用其 DocumentUser 检索文档,该 DocumentUser 由外键(“document_id”)链接自身

pojo 类:

文档

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name = "DYS_BYS_DOSYA")
@Audited
public class Document implements Serializable {

    private Long id;
    private String name;

    private List<DocumentUser> documentUserList = new ArrayList<DocumentUser>();

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", nullable = false, precision = 15, scale = 0)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "AD", nullable = false, length = 500)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @OneToMany(mappedBy = "document", fetch = FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
    @Cascade(CascadeType.ALL)
    public List<DocumentUser> getDocumentUserList() {
        return documentUserList;
    }

    public void setDocumentUserList(List<DocumentUser> documentUserList) {
        this.documentUserList = documentUserList;
    }

    @Override
    public String toString() {
        return "tr.com.enlil.dys.server.servis.model.Document[id=" + id + "]";
    }
}

文档用户:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name = "DYS_DOSYA_SAHIBI_USER")
@Audited
public class DocumentUser implements Serializable {


    /**
     * 
     */
    private static final long serialVersionUID = 6393919788296838129L;

    private Long id;
    private Long personelId;
    private Document document;

    private String personelName;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", unique = true, nullable = false, precision = 15, scale = 0)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "OLUSTURUCU_PERSONEL_ID")
    public Long getPersonelId() {
        return personelId;
    }

    public void setPersonelId(Long personelId) {
        this.personelId = personelId;
    }

    @Column(name = "KULLANICI_AD")
    public String getPersonelName() {
        return personelName;
    }

    public void setPersonelName(String personelName) {
        this.personelName = personelName;
    }

    @ManyToOne
    @JoinColumn(name = "DOSYA_ID")
    public Document getDocument() {
        return document;
    }

    public void setDocument(Document document) {
        this.document = document;
    }
}

这样,我怎样才能通过使用条件查询来获取依赖于 DocumentUser 表的 personelId 的文档数据?我不熟悉hibernate,我需要你的帮助。我尝试编写一些代码,但没有成功。

public List<Document> fetchRecordsByCriteriaLimitedList(String userId) throws Exception{
        Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Dosya.class);

        DetachedCriteria dosyaSahibiCriteria = (DetachedCriteria) criteria.createCriteria("documentUserList");
        dosyaSahibiCriteria.add(Restrictions.eq("personelId", userId));
        dosyaSahibiCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

            return criteria.list();

    }

【问题讨论】:

    标签: java hibernate criteria criteria-api detachedcriteria


    【解决方案1】:

    您的代码存在几个问题。首先,你说

    2)DocumentUser 是 Document 的子类

    从您的代码来看,这不是真的(这意味着DocumentUser extends Document),但您可能意味着它们处于父-> 子关系中。其次,在documentUserList映射中,有这个@OneToMany(mappedBy = "dosya", fetch = FetchType.EAGER),表示DocumentUser中有一个名为dosya的字段,没有。而是将其替换为 mappedBy = "document"。假设一切正常,根据 DocumentUser 的 id 查询获取所有文档将是

    public List<Document> fetchRecordsByCriteriaLimitedList(String userId) throws Exception{
        Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Document.class);
        criteria.createAlias("documentUserList", "users").add(Restrictions.eq("users.personelId", userId));
        return criteria.list();
    }
    

    【讨论】:

    • 我把我的代码翻译成英文,但我忘了改。你是对的,我试图通过说“子类”来谈论亲子关系。也是我的错。对不起。让我编辑它们。
    • @angaraeski 我明白了,然后一切看起来都不错。从我的答案中查询是否有效?
    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2014-11-07
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多