2016-09-19 3 views
2

У меня есть объект, который выглядит следующим образом, например:Сортировка Entity на основе максимального значения коллекции

  • Студенческого --Entity

  • Тема --Entity

A у ученика может быть много предметов, так что это отношения друг к другу. Мне нужно написать следующий запрос в JPA [named/typed query] (но не native)

Получить первый n (размер страницы) студентов, которые имеют максимальную отметку независимо от темы. Наивысшие оценки в любой теме. и один студенческий отчет должен быть возвращен один раз.

  • размер страницы - Я использовал firstResult() и maxResults() для этого и работает
  • сортировки - нужно найти решение

тестовых данных: Data

import java.util.List; 

import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 

@Entity 
public class Student { 

    @Id 
    private Integer studentId; 

    private String name; 

    @OneToMany 
    private List<Subject> subjects; 

    public Integer getStudentId() { 
     return studentId; 
    } 

    public void setStudentId(Integer studentId) { 
     this.studentId = studentId; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public List<Subject> getSubjects() { 
     return subjects; 
    } 

    public void setSubjects(List<Subject> subjects) { 
     this.subjects = subjects; 
    } 

} 

и

import javax.persistence.Entity; 
import javax.persistence.Id; 

@Entity 
public class Subject { 
    @Id 
    private Integer subjectId; 

    private String subjectName; 

    private Integer marks; 

    public Integer getSubjectId() { 
     return subjectId; 
    } 

    public void setSubjectId(Integer subjectId) { 
     this.subjectId = subjectId; 
    } 

    public Integer getMarks() { 
     return marks; 
    } 

    public void setMarks(Integer marks) { 
     this.marks = marks; 
    } 

    public String getSubjectName() { 
     return subjectName; 
    } 

    public void setSubjectName(String subjectName) { 
     this.subjectName = subjectName; 
    } 

} 
+0

Пожалуйста, поделитесь, как должен выглядеть сортированный результат. Я имею в виду сортировку всех студентов на основе высших оценок в любом предмете? –

+0

Да, проверьте данные в ожидаемом выходе. Наивысшие оценки в любом предмете. и один рекорд записи должен быть возвращен один раз. – RCInd

+0

ваши классы pojo выглядят подозрительными для меня.Вы уверены, что третья таблица не создана для сопоставления отношений? –

ответ

0

Приведенная ниже программа даст вам требуемую мощность для Сортировка.

Извлечение данных класса:

public static void main(String[] args) { 
    SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory(); 
    Session session = sessionFactory.openSession(); 

    Criteria c = session.createCriteria(Student.class, "student"); 
    c.setFetchMode("student.subjects", FetchMode.JOIN); 
    c.createAlias("student.subjects", "subjects"); 

    ProjectionList columns = Projections.projectionList() 
      .add(Projections.property("student.name")) 
      .add(Projections.property("subjects.subjectName")) 
      .add(Projections.property("subjects.marks")); 
    c.setProjection(columns); 
    c.addOrder(Order.desc("subjects.marks")); 

    List<Object[]> list = c.list(); 
    for (Object[] arr : list) { 
     System.out.println(Arrays.toString(arr)); 
    } 

    System.out.println("Data is retrieved successfully..."); 
} 

Студент POJO класс:

package com.sorting; 

import java.util.List; 
import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

@Entity 
@Table(name = "Student") 
public class Student { 

@Id 
private Integer studentId; 

private String name; 

@OneToMany(cascade = CascadeType.ALL) 
private List<Subject> subjects; 

public Integer getStudentId() { 
    return studentId; 
} 

public void setStudentId(Integer studentId) { 
    this.studentId = studentId; 
} 

public String getName() { 
    return name; 
} 

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

public List<Subject> getSubjects() { 
    return subjects; 
} 

public void setSubjects(List<Subject> subjects) { 
    this.subjects = subjects; 
} 

@Override 
public String toString() { 
    return "Student [studentId=" + studentId + ", name=" + name 
      + ", subjects=" + subjects + "]"; 
} 
} 

Тема POJO Класс:

package com.sorting; 

import javax.persistence.Entity; 
import javax.persistence.Id; 

@Entity 
public class Subject { 
@Id 
private Integer subjectId; 
private String subjectName; 
private Integer marks; 

public Integer getSubjectId() { 
    return subjectId; 
} 

public void setSubjectId(Integer subjectId) { 
    this.subjectId = subjectId; 
} 

public Integer getMarks() { 
    return marks; 
} 

public void setMarks(Integer marks) { 
    this.marks = marks; 
} 

public String getSubjectName() { 
    return subjectName; 
} 

public void setSubjectName(String subjectName) { 
    this.subjectName = subjectName; 
} 

@Override 
public String toString() { 
    return "Subject [subjectId=" + subjectId + ", subjectName=" 
      + subjectName + ", marks=" + marks + "]"; 
} 
} 

hibernate.cfg.xml отображения

<mapping class="com.sorting.Student"/> 
    <mapping class="com.sorting.Subject"/> 

данных Сохранение класса:

public static void main(String[] args) { 
    ArrayList<Subject> s1SubjectList = new ArrayList<Subject>();//Student 1 Subject List 
    ArrayList<Subject> s2SubjectList = new ArrayList<Subject>();//Student 2 Subject List 
    ArrayList<Subject> s3SubjetcList = new ArrayList<Subject>();//Student 3 Subject List 

    Subject s1s1= new Subject();//Student 1 Subject 1 
    s1s1.setSubjectId(1); 
    s1s1.setSubjectName("ENG"); 
    s1s1.setMarks(85); 
    //Add to List 
    s1SubjectList.add(s1s1); 
    Subject s1s2= new Subject();//Student 1 Subject 2 
    s1s2.setSubjectId(2); 
    s1s2.setSubjectName("MATHS"); 
    s1s2.setMarks(89); 
    //Add to List 
    s1SubjectList.add(s1s2); 
    Subject s1s3= new Subject();//Student 1 Subject 3 
    s1s3.setSubjectId(3); 
    s1s3.setSubjectName("PHY"); 
    s1s3.setMarks(90); 
    //Add to List 
    s1SubjectList.add(s1s3); 

    Subject s2s1= new Subject();//Student 2 Subject 1 
    s2s1.setSubjectId(4); 
    s2s1.setSubjectName("ENG"); 
    s2s1.setMarks(90); 
    //Add to List 
    s2SubjectList.add(s2s1); 
    Subject s2s2= new Subject();//Student 2 Subject 2 
    s2s2.setSubjectId(5); 
    s2s2.setSubjectName("MATHS"); 
    s2s2.setMarks(95); 
    //Add to List 
    s2SubjectList.add(s2s2); 
    Subject s2s3= new Subject();//Student 2 Subject 3 
    s2s3.setSubjectId(6); 
    s2s3.setSubjectName("PHY"); 
    s2s3.setMarks(89); 
    //Add to List 
    s2SubjectList.add(s2s3); 

    Subject s3s1= new Subject();//Student 3 Subject 1 
    s3s1.setSubjectId(7); 
    s3s1.setSubjectName("ENG"); 
    s3s1.setMarks(96); 
    //Add to List 
    s3SubjetcList.add(s3s1); 
    Subject s3s2= new Subject();//Student 3 Subject 2 
    s3s2.setSubjectId(8); 
    s3s2.setSubjectName("MATHS"); 
    s3s2.setMarks(85); 
    //Add to List 
    s3SubjetcList.add(s3s2); 
    Subject s3s3= new Subject();//Student 3 Subject 3 
    s3s3.setSubjectId(9); 
    s3s3.setSubjectName("PHY"); 
    s3s3.setMarks(99); 
    //Add to List 
    s3SubjetcList.add(s3s3); 

    //Create Student 1 
    Student s1=new Student(); 
    s1.setStudentId(1); 
    s1.setName("Foo"); 
    s1.setSubjects(s1SubjectList); 

    //Create Student 2 
    Student s2=new Student(); 
    s2.setStudentId(2); 
    s2.setName("Bar"); 
    s2.setSubjects(s2SubjectList); 

    //Create Student 3 
    Student s3=new Student(); 
    s3.setStudentId(3); 
    s3.setName("Doo"); 
    s3.setSubjects(s3SubjetcList); 

    SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory(); 
    Session session = sessionFactory.openSession(); 
    Transaction tx = session.beginTransaction(); 
    session.persist(s1); 
    session.persist(s2); 
    session.persist(s3); 
    tx.commit(); 
    session.close(); 
    System.out.println("Student entries saved..."); 
} 

Выход: Выход сортируются на основе самых высоких отметок студента в определенной теме.

Output

+0

Это то, о чем вы просили? –

Смежные вопросы