【问题标题】:how map join query columns to a class using hibernate?如何使用休眠将查询列映射到类?
【发布时间】:2020-09-24 14:18:59
【问题描述】:

我尝试创建一个从两个表返回不同列的查询,并且我希望将查询列映射到用户定义类。

我的学生模型:

package com.example.demo.models;

import javax.persistence.*;
import java.util.List;

@Entity
@Table
public class Students {
    public Students() {
    }

    public Students(String firstName, String lastName, String age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    @Column
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column
    private String firstName;

    @Column
    private String lastName;

    @Column
    private String age;

    @ManyToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(name = "Student_Course",
            joinColumns = @JoinColumn(name="studentID"),
            inverseJoinColumns = @JoinColumn(name="courseID"))
    private List<Course> courses;


    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public List<Course> getCourses() {
        return courses;
    }

    public void setCourses(List<Course> courses) {
        this.courses = courses;
    }
}

我的课程模型:

package com.example.demo.models;

import javax.persistence.*;
import java.util.List;

@Entity
@Table
public class Course {
    public Course() {
    }

    public Course(String courseName, String unitCount) {
        this.courseName = courseName;
        this.unitCount = unitCount;
    }

    @Column
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "CourseName")
    private String courseName;

    @Column
    private String unitCount;

    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(name = "Student_Course",
            joinColumns = @JoinColumn(name="courseID"),
            inverseJoinColumns = @JoinColumn(name="studentID"))
    private List<Students> students;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "teacherID")
    private Teachers teachers;

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getUnitCount() {
        return unitCount;
    }

    public void setUnitCount(String unitCount) {
        this.unitCount = unitCount;
    }

    public List<Students> getStudents() {
        return students;
    }

    public void setStudents(List<Students> students) {
        this.students = students;
    }

    public Teachers getTeachers() {
        return teachers;
    }

    public void setTeachers(Teachers teachers) {
        this.teachers = teachers;
    }
}

我在服务层的查询:

    @Transactional
    public List<StudentInfo> getStudentInfo(){
        Session session = sf.openSession();
        Query hql = session.createQuery("select std.firstName, std.lastName, c.courseName from Students std join std.courses c");
        var data = hql.list();
        session.close();

        return data;
    }

我想将查询列映射到这个简单的类:

package com.example.demo.ViewModels;

public class StudentInfo {
    private String firstName;
    private String lastName;
    private String courseName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
}

最后……
我的控制器类:

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView Index() {

       List<StudentInfo> data = studentRepository.getAll();


        return new ModelAndView("indexView", "data", data);
    }

注意:我在这个项目中使用百里香。
请帮助我。
谢谢。:D

【问题讨论】:

    标签: java spring hibernate spring-mvc hql


    【解决方案1】:

    如果您使用Spring Data JPA,您应该可以在存储库中使用@Query 注解:

    @Query(value = "SELECT new com.path.to.StudentInfo(std.firstName, " + 
        "std.lastName, c.courseName) " + 
        "FROM Students std join std.courses c"
    List<StudentInfo> getAllStudentInfo();
    

    请确保您在 StudentInfo 中有一个全参数构造函数。

    如果你使用Hibernate,几乎是一样的:

    entityManager.createQuery("SELECT new com.path.to.StudentInfo(std.firstName, " +
        "std.lastName, c.courseName) " + 
        "FROM Students std join std.courses c", 
    StudentInfo.class)
    

    编辑:我担心在使用join 时它是否应该工作,但无论如何都要试一试。

    【讨论】:

    • 感谢 Krisz :)。我有一个问题。 '@Query' 最多替换服务层的接口方法或类方法?因为我有带有“@Repository”注释的接口和带有“@Service”注释的类。
    • 您必须在存储库层中添加一个带有Query 的方法。见docs.spring.io/spring-data/jpa/docs/current/reference/html/…
    • 谢谢你..:D
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2018-09-02
    • 2020-12-08
    • 2017-04-09
    • 1970-01-01
    相关资源
    最近更新 更多