關於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 = session.createCriteria(User.class,"user");
ProjectionList pList = Projections.projectionList();
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();