2014年3月14日

Hibernate addEntity, addScalar

使用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];

    //執行您要的處理邏輯....
}