簡體   English   中英

通過注釋加入休眠

[英]Join in hibernate with annotaion

我正在嘗試在hibernate中執行join,我正在使用struts2。 我正在使用注釋來處理hibernate。 現在我無法在兩個表之間執行聯接。我的第一個表是包含pid和email的“ studentprojects”。第二個表是包含pid,name,description ...類似的其他字段的“ initialprojectdetials”。我必須獲取通過在第一個表的pid周圍執行連接來獲取第二個表的數據。 為此使用此查詢:

String hql="from InitialProjectDTO I join I.projectId S where I.projectId=:id";
        Query query=session.createQuery(hql);
        query.setParameter("id", id);
        mail =query.list();

其中mail是InitialProjectDTO的arraylist。 我的InitialProjectDTO是:

package edu.pma.dto;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;



@Entity
@Table(name="initialprojectdetail")
public class InitialProjectDTO {

    @Id
    @Column(name="projectId")
    @OneToMany(cascade=CascadeType.ALL)
    @JoinTable(name="studentprojects",joinColumns=@JoinColumn(name="projectId"))
    int projectId;

    @Column(name="name")
    String name;

    @Column(name="description")
    String description;

    @Column(name="technology")
    String technology;

    @Column(name="guide")
    String guide;

    @Column(name="duration")
    int duration;

    @Column(name="status")
    String status;
    @Column(name="report")
    String report;

    public String getReport() {
        return report;
    }

    public void setReport(String report) {
        this.report = report;
    }

    public int getProjectId() {
        return projectId;
    }

    public void setProjectId(int projectId) {
        this.projectId = projectId;
    }

    public String getName() {
        return name;
    }

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

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getTechnology() {
        return technology;
    }

    public void setTechnology(String technology) {
        this.technology = technology;
    }

    public String getGuide() {
        return guide;
    }

    public void setGuide(String guide) {
        this.guide = guide;
    }

    public int getDuration() {
        return duration;
    }

    public void setDuration(int duration) {
        this.duration = duration;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

}

我的SudentProjectDTO是:

package edu.pma.dto;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="studentprojects")
public class StudentProjectDTO {

    public int getProjectId() {
        return projectId;
    }
    public void setProjectId(int projectId) {
        this.projectId = projectId;
    }
    @Id
    @Column(name="email")
    String email;
    @Column(name="projectId")
    int projectId;
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

}

這是我得到的錯誤:

Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: edu.pma.dto.InitialProjectDTO.projectId
Method "execute" failed for object edu.pma.actions.LoginAction@1096a56
File:   org/hibernate/cfg/annotations/CollectionBinder.java

您應該嘗試使用不同的模型

@Entity
public class InitialProjectDTO {

 @OneToMany(mappedBy = "project")
 private Collection<StudentProjectDTO> students;

}

@Entity
public class StudentProjectDTO {

 @ManyToOne
 private InitialProjectDTO project;

}

有了正確的模型,編寫hql將會很容易,您可能想在這里查看示例https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

我也建議在這里查看模型示例。 http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/

請參閱以下示例,它可能對您有幫助

@Entity
@Table(name="initialprojectdetail")
public class InitialProjectDTO {


    private Integer initialProjectDTOId;
    private Set<StudentProjectDTO > studentProjectDTO  = new HashSet<StudentProjectDTO >(0);

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "initial_projectDTO_id", unique = true, nullable = false)
    public Integer getInitialProjectDTOId() {
        return this.initialProjectDTOId;
    }

    public void setInitialProjectDTOId(Integer initialProjectDTOId) {
        this.initialProjectDTOId = initialProjectDTOId;
    }

    @OneToMany(mappedBy = "studentprojects", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
    public Set<StudentProjectDTO> getUserRole() {
        return this.studentProjectDTO;
    }

    public void setUserRole(Set<StudentProjectDTO> studentProjectDTO) {
        this.studentProjectDTO = studentProjectDTO;
    }  

}

@Entity
@Table(name="studentprojects")
public class StudentProjectDTO {

    private InitialProjectDTO project;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "initial_projectDTO_id", nullable = false)
    public User getProject() {
        return this.project;
    }

    public void setProject(InitialProjectDTO project) {
        this.project = project;
    }
}

您的查詢應該是這樣的

String hql="SELECT ip from InitialProjectDTO ip JOIN ip.studentProjectDTO sp WHERE sp.projectId = :id";
        Query query=session.createQuery(hql);
        query.setParameter("id", id);
        mail =query.list();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM