Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate查询:从与一侧匹配的多方检索行_Hibernate_Hql - Fatal编程技术网

Hibernate查询:从与一侧匹配的多方检索行

Hibernate查询:从与一侧匹配的多方检索行,hibernate,hql,Hibernate,Hql,使用hibernate从数据库检索记录时出现问题。情况就是这样。 我有3门课(还有3张桌子) 这些是我的课 Exam ----- Integer exam_id String exam_name Subject ------- Integer subject_id, String subject_name Scores ------- Exam exam, Subject subject, Integer score 这些是我的桌子 Exam ----- exam_id, exam_nam

使用hibernate从数据库检索记录时出现问题。情况就是这样。 我有3门课(还有3张桌子)

这些是我的课

Exam
-----
Integer exam_id
String exam_name

Subject
-------
Integer subject_id,
String subject_name

Scores
-------
Exam exam,
Subject subject,
Integer score
这些是我的桌子

Exam
-----
exam_id,
exam_name

Subject
-------
subject_id,
subject_name

Scores
-------
exam_id,
subject_id,
score
我想做的是,我想检索科学科目的所有分数。我认为可以使用这个sql查询来实现这一点

从sc.subject\u id=su.subject\u id上的分数sc内部连接subject su中选择sc.*,其中su.subject\u name=“science”

但我想知道最好的归档方法。是否可以使用“标准”来实现这一点?还是其他最好的方法?请在这方面指导我


谢谢

Hibernate是一种ORM技术。如果您有这样的PK/FK相关表,那么应该通过XML配置或基于注释的映射告诉Hibernate。然后,您可以通过HQL查询得到类似这样的结果

from Scores sc where sc.subject.subjectName="science"
class Scores{
  Subject subject;
  Exam exam;
  int score;

  // getters and setters
}

class Subject{
  int subjectId;
  String subjectName;

 // getters and setters
}

class Exam{
  int examId;
  String examName;

 // getters and setters
}
我假设分数表和主题表是通过主题id列关联的。所以,你的课程应该是这样的

from Scores sc where sc.subject.subjectName="science"
class Scores{
  Subject subject;
  Exam exam;
  int score;

  // getters and setters
}

class Subject{
  int subjectId;
  String subjectName;

 // getters and setters
}

class Exam{
  int examId;
  String examName;

 // getters and setters
}

然后,您可以使用scores对象的subject字段来获取分数。

是的,您可以使用条件,但使用简单的HQL查询更简单

CriteriaBuilder cb = em.getCriteriaBuilder();   //em is the entity manager

CriteriaQuery<Scores> criteriaQuery = cb.createQuery(Scores.class);             
Root<Scores> scoreRoot = criteriaQuery.from(Scores.class);

Subquery<Integer> subquery = criteriaQuery.subquery(Integer.class);
Root root = subquery.from(Subject.class);

subquery.select(root.get("subject_id"));
subquery.where(cb.equal(root.get("subject_name"), "science"));

criteriaQuery.where(cb.equal(scoreRoot.get("subject_id"),subquery));

TypedQuery<Score> query = em.createQuery(criteriaQuery);

return query.getResultList(); //this is the result
CriteriaBuilder cb=em.getCriteriaBuilder()//em是实体经理
CriteriaQuery CriteriaQuery=cb.createQuery(Scores.class);
Root scoreRoot=criteriaQuery.from(Scores.class);
Subquery Subquery=criteriaQuery.Subquery(Integer.class);
Root=subquery.from(Subject.class);
选择(root.get(“subject_id”);
其中(cb.equal(root.get(“subject_name”),“science”);
其中(cb.equal(scoreRoot.get(“subject_id”),子查询));
TypedQuery=em.createQuery(criteriaQuery);
返回query.getResultList()//这就是结果
这是使用标准