如何在JPQL中使用地图?

时间:2014-11-09 07:29:29

标签: java jpa jpql

以下是问题的概述..

public class Student
{
  private Map<Test,MarkWrapper> marks;
  ...
}

public class MarkWrapper
{
  private List<Mark> marks;
  ...
}

public class Test
{
  private String name;
  private Date date;
  ..
}

public class Mark
{
  private int mark;
  private int total;
  private float average;
  ...
}

现在,我想找回有90分的学生。而不是通过删除地图来改变架构,如何解决这个问题?

在Map类中,没有getter方法来获取其中的值。如果无法实现,那么我将如何使用Criteria API?

谢谢。

2 个答案:

答案 0 :(得分:0)

  

我想找回有90分的学生

如果您想要检索标记为90的学生,请将您的地图密钥设为 90 ,并为学生增加价值。

示例:

通过迭代studentList获得90分的学生在地图上显示

Map<Integer,Student> studentMap=new HashMap<Integer, Student>();
List<Student> studentList= <yourStudentList>;
for(Student student : studentList){
    if(student.getMarks() == 90){
        studentMap.put(90,student);
    }
}

修改

我假设您将实体类名称设为Student并拥有属性marks,依此类推。

使用JPQL:

您可以从数据库中获取学生列表

String jpql="Select s from Student s where s.marks =:marks ";
Query query=em.createQuery(jpql);
query.setParameter("marks", 90);
List<Student> studentList=query.getResultList();//returns all students who got marks 90

String jpql="Select s from Student s ";
Query query=em.createQuery(jpql);
List<Student> studentList1=query.getResultList();//returns all students

你可以像我之前所说的那样通过迭代studentList1为所有获得90分的学生提供地图

答案 1 :(得分:0)

示例JPQL查询字符串:

SELECT s FROM Student s JOIN s.marks sm 
WHERE VALUE(sm) IN (
  SELECT mw FROM MarkWrapper mw JOIN mw.marks mwm 
  WHERE mwm.mark = :value
)

其中:value是查询参数(即90)