使用hibernate的好處是在下hql語法查詢時可以自動的將table的一個record自動轉成一個物件, 例如一個user table含有下列欄位id, name, phone, groupid
我們可以依此table schema來建立下列class
public class User {
private String id;
private String name;
private String phone;
private String groupid;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getGroupid() {
return phone;
}
public void setGroupid(String groupid) {
this.phone = phone;
}
}
使用下列hql查詢我們即可得到User的物件
Query query = session.createQuery("from User");
List<User> list = query.list();
但實務上我們的的sql查詢條件可能需要join多個table,要如何使用我們較習慣的sql查詢語法且又能夠將查詢結果自動的轉成物件?我們可以使用hibernate的addEntity, addScalar來達成這個目的
假設我們有下列2個table
- user(人員) 含有下列欄位 id, name(姓名), phone(電話), address(地址), groupid(所屬單位id)
group(單位) 含有下列欄位 groupid(單位id), groupname(單位名字)
註:user(人員)的groupid是關連到group(單位)的groupid
假設我們要查出電話是0912開頭的人員資料與該人所屬的單位名稱,我們可以使用下列sql
select user.*, group.groupname groupname from user, group where user.phone like '0912%' and user.groupid = group.groupid
下列為查詢結果
id name phone groupid groupname
1 james 0912345678 pg 開發部
3 wade 0912888888 sa 分析部
註:前4個欄位來自user table, 最後一個欄位來自group table
如果我們要將來自user table的欄位(id, name, phone, groupid)自動的轉成user物件的話我們可以用下列的語法
String sql = "select user.*, group.groupname groupname from user, group where user.phone like '0912%' and user.groupid = group.groupid";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity("user", User.class); //將查詢結果的user.*轉成User物件
sqlQuery.addScalar("groupname", StandardBasicTypes.STRING); //將查詢結果的groupname轉成字串
List<Object[]> datas = sqlQuery.list();
for(Object[] objs : datas) {
User user = (User) objs[0];
String groupName = (String) objs[1];
//執行您要的處理邏輯....
}
沒有留言:
張貼留言