Hibernate自定義字段查詢


關於Hibernate自定義字段查詢的方法,網上有很多,我這里就不詳細寫了,只把幾個查詢方法的注意事項說明一下。

廢話少說, 進入正題:

 

假設有2個實體對象,Institution和User,結構與配置如下:

@Entity(value = "Institution")

@Table(name = ”TB_INSTITUTION") 

public class Institution {

@Id 

private  int id;

private String institutionName; 

@Entity(value="User")

@Table(name="TB_USER") 

public class User{

@Id 

private int id;

private String username;

@ManyToOne

@JoinColumn(name="institutionId")

private Institution institution; 

 

public User(){

 

}

 

public User(int id,String username,String institutionName){

this.id = id;

this.username = username;

this.institution = new Institution();

this.institution.setInstitutionName(institutionName); 

此處省略了一些配置和set,get方法。 

下面查詢User對象 

第一種方法:

 

Criteria對象查詢方法

Criteria criteria = session.createCriteria(User.class,"user");

criteria.createCriteria("institution","institution");
 

ProjectionList pList = Projections.projectionList();

pList.add(Projections.property("user.id").as("id"))
add(Projections.property("user.username").as("username"))
.add(Projections.property("institution.institutionName").as("institutionName"));

criteria.setResultTransformer(Transformers.aliasToBean(User.class));

criteria.list(); 

第二種方法:

HQL查詢

String hql = null;

hql = "SELECT new User(u.id,u.username,u.institution.institutionName) FROM User as u"; 

Query query = session.createQuery(hql);

query.list();

注意的地方是:

1、Criteria 查詢需要提供相應字段的set和get方法,HQL需要提供相應的構造函數。

2、當User關聯的外鍵 institutionId為null時,查詢是必須使用Left join(

SELECT new User(u.id,u.username,ins.institutionName) FROM User as u LEFT JOIN u.institution as ins),

因為Hibernate默認是INNER JOIN,否則查詢不出institutionId為null的記錄.

3、編寫的HQL語句中的各字段必須都有嚴格定義,例如:u.id,u.username而不是直接使用id,username。

 

另外: 也可以使用SQL語句查詢自定義字段。

格式是:

SELECT new User(u.id,u.username,ins.institutionName) FROM TB_USER AS u LEFT JOIN TB_INSTITUTION AS ins ON ins.id = u.institutionId;  

這種方法我沒試過,有興趣的朋友可以試試。

 

舉一反三:

經測試:SELECT new User(u.id,u.username,new Institution(u.institution.institutionName)) FROM User as u 

這種形式的語句是沒辦法通過的。Hibernate還沒智能到可以在對象里面檢測對象。

 

寫的不對的地方,請指證; 

歡迎大家評論,發表自己的意見。

 

 

List results = session.createCriteria(House.class)
    .setProjection( Projections.groupProperty("id")).list(); 

或者

List results = session.createCriteria(House.class)
    .setProjection( Projections.projectionList()
        .add( Projections.property("id")) )
    .list();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM