2013-10-04 69 views
0

我使用休眠從數據庫檢索記錄時遇到問題。這是情況。 我有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查詢來做到這一點。

select sc。* from Scores sc inner join subject su on sc.subject_id = su.subject_id where su.subject_name =「science」。

但我想知道存檔這個最好的方法。是否可以使用「標準」來做到這一點?或者任何其他最好的方式?請在此引導我。

感謝

回答

1

是的,你可以使用標準,但使用簡單的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 

這是使用標準。

1

Hibernate是一個ORM技術。如果你有這樣的PK/FK相關表,你應該通過XML配置或基於註釋的映射來告訴Hibernate關於它們的信息。然後你可以通過HQL查詢得到你的結果。

from Scores sc where sc.subject.subjectName="science" 

我假設評分表和主題表通過subject_id列相關。所以,你的課堂應該是這樣的;

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對象的主題字段來達到分數。