2016-03-25 2 views
1

Я пытаюсь выполнить соединение в спящем режиме, и я использую struts2. Я работаю с hibernate с помощью аннотаций. Теперь я не могу выполнить соединение между двумя таблицами. Моя первая таблица - «студенческие проекты», содержащие pid и email. Вторая таблица - «initialprojectdetials», которая содержит pid, name, description ... аналогично некоторым другим полям. Мне нужно получить данные второй таблицы, выполнив объединение вокруг pid первой таблицы. Для этого я использую этот запрос:Присоединиться к hibernate с annotaion

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(); 

где почта является ArrayList из InitialProjectDTO. И мой 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",[email protected](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 [email protected] 
File: org/hibernate/cfg/annotations/CollectionBinder.java 
+0

Спасибо за ваш ответ. Но это не сработало для меня. Я использую аннотацию, поэтому я не могу добавить дополнительное поле в мой класс DTO, кроме тех, которые являются частью db-таблицы. Поэтому это дает мне ошибку в том, что не строит фабрику сесдиона. –

ответ

0

Вы должны попытаться использовать различные модели

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

0

См следующий пример может его помощь вам

@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(); 
Смежные вопросы