2015-04-01 10 views
1

我通過使用標準的API上的休眠的工作,我有學生和學科兩個實體是存在的,學生有一個與主題一對多的關係,在主題表我有一列結果,現在我想編寫查詢如果學生通過所有科目(基於結果列)我想獲取其他明智的用戶我不想返回任何用戶。如何爲此編寫標準查詢。如何通過使用休眠條件傳遞所有主題的用戶?

@Entity(name="student") 
public class Student 
{ 
    @column(name="Id") 
    private int id; 

    @column(name="name") 
    private String name; 

    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL) 
    private List<Subject> subject = new ArrayList<Subject>(); 

//setter getter methods 
} 

@Entity(name="subject") 
public class Subject 
{ 
    @column(name="Id") 
    private int id; 

    @column(name="subject_name") 
    private String subjectName; 

    @manytoOne 
    @Joincolumn(name="student_id") 
    private Suduent suduent; 

    @column(name="result) 
    private String result; 
//setter getter methods 
} 

請檢查下面的示例數據 學生:

Id------Name 

1-------Test 

2------Test2 

主題

Id ---- Subject_Name ------ Result------ StudnetId 

1------Java------------------pass---------1 

2-------.net----------------fail---------1 

3-------Java---------------pass---------2 

4--------.net------------pass ---------2 

任何一個可以幫助我。

回答

3

嗨我會盡力回答您的問題我承諾
1. 標準只能選擇投影或根實體。
2.在下面的代碼片段應該爲你工作與結果爲「合格」檢索的學生。(我假設你存儲本作中,結果值時,學生通過主題)

Criteria criteria = session.createCriteria(Student.class, "student"); 
criteria.createAlias("student.subject", "subject "); 
criteria.add(Restrictions.eq("subject.result", "pass"); 
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
  • HQL對你來說會更好更簡單,請嘗試下面的HQL ..
    我再一次假設'pass'是結果。

    選擇學生的學生不同的學生 加入student.subject主題 其中subject.result =「通」

  • 2

    您的需求「如果學生通過了所有科目」,再返回學生證

    我想你只是想通過所有科目都合格的學生。所以sql查詢將如下所示:

    SQL查詢:

    select student_id 
    from subject a 
    where result="pass" 
    group by student_id 
    having count(subject_id) = (
        select count(subject_id) 
        from subject 
        where student_id = a.student_id 
        group by student_id 
    ) 
    

    在Hibernate Criteria中,您實際上無法擁有count(subject_id),因此您將不得不手動傳遞所有學生必須通過的主題no。

    代碼:

    DetachedCriteria dc = DetachedCriteria.forClass(Subject.class,"subQuery"); 
    dc.createAlias("student", "student"); 
    dc.setProjection(Projections.rowCount()); 
    dc.add(Restrictions.eqProperty("student.id","outerQuery.student.id")); 
    
    Criteria query = session.createCriteria(Subject.class,"outerQuery"); 
    query.createAlias("student", "student"); 
    query.setProjection(Projections.projectionList() 
             .add(Projections.groupProperty("student.id")) 
             .add(Projections.count("id")) 
           ); 
    
    query.add(Restrictions.eq("result","pass")); 
    // The total number of subjects has to be passed explicitly. 
    query.add(Subqueries.eq(new Long(2), dc));