資料準備
一:本地sql查詢,原生sql
/**
* 本地sql查詢,原生sql
*/
public void sqlQuery(){
//傳回Object數組
@SuppressWarnings("unchecked")
List<Object> list = session.createSQLQuery("select uname,upwd from user").list();
System.out.println("[uname:"+((Object[])list.get(0))[0]+" upwd:"+((Object[])list.get(0))[1]+"]");
//addEntity(Class clazz) 轉化為java bean
@SuppressWarnings("unchecked")
List<User> userList= session.createSQLQuery("select * from user").addEntity(User.class).list();
System.out.println(userList.get(0));
//setParameterList 多參數 in not in
Integer[] ids = {1,2};
@SuppressWarnings("unchecked")
List<User> userlist2 = session.createSQLQuery("select * from user where id in :id").
addEntity(User.class).setParameterList("id",ids).list();
System.out.println(userlist2);
}
二:命名查詢
/**
* 命名查詢 采用 @NamedQueries 和@NamedQuery注解
* @NamedQueries({
* @NamedQuery(name="user.findUserByName",query="select u from User u where u.uname=:uname")
* })
*/
public void namedQuery(){
//傳回單挑資料 uniqueResult();
User u = (User)session.getNamedQuery("user.findUserByName").setString("uname", "admin").uniqueResult();
System.out.println(u);
}
三:指定字段查詢(比較進階點的一般人都不知道)
/**
* 查詢指定字段,過濾不需要的資料,節省空間。
* 還有就是hibernate關聯太多 查詢對象全部資訊容易堆棧溢出
*
*/
public void toMapOrBeanQuery(){
//查詢指定字段不經過特殊處理 傳回的是Object[]類型
Object[] o = (Object[])session.createQuery("select u.uname,u.age,u.email from User u whereu.uname='admin'").uniqueResult();
System.out.println("[uname:"+o[0]+" age:"+o[1] +" email:"+o[2]+"]");
//封裝為 Map
List<Map<String, Object>> mapList = (List<Map<String, Object>>)session.createQuery("select new Map(u.uname as uname,u.email as email,u.age as age) from User u").list();
for(Map map : mapList){
System.out.println(map.get("uname")); //uname 是 as 後面的别名
System.out.println(map.get("email"));
}
//封裝成Java Bean --> new User(u.uname,u.email,u.age) 必須有指定的構造方法
List<User> list = (List<User>)session.createQuery("select new User(u.uname,u.email,u.age) from User u").list();
System.out.println(list);
}
==================帶有關聯關系的查詢,這個有點難以了解=====
/**
* 帶關聯關系的 指定字段查詢
*/
public void toMapOrBeanQuery2(){
//這個封裝成Map 比較簡單,和上面的一樣
String hql = "select new Map(u.uname as uname,c.type as type,c.cardId as cardid) from User u,Card c where (u.id = c.user.id)";
List<Map<String, Object>> mapList = (List<Map<String, Object>>)session.createQuery(hql).list();
System.out.println(mapList);
//[{type=身份證, cardid=511325xxx, uname=admin}, {type=銀行卡, cardid=62122xxx, uname=admin}]
//封裝javabean 下面的構造方法有點難以了解 ,隻可意會
//多對一方 查詢方式
/** 構造方法如下
* public Card(String cardId, String type, String uname) {
super();
this.cardId = cardId;
this.type = type;
User u = new User();
u.setUname(uname);
this.user = u;
}
*/
String hql2 = "select new Card(c.type,c.cardId,c.user.uname) from User u,Card c where (u.id = c.user.id)";
List<Card> list = session.createQuery(hql2).list();
System.out.println(list);
//[Card [id=0, cardId=身份證, type=511325xxx, username=admin], Card [id=0, cardId=銀行卡, type=62122xxx, username=admin]]
//一對多的方式
/**
* 這裡有 多的一方的兩個字段
* public User(String uname, String type,String card) {
super();
this.uname = uname;
List<Card> li = new ArrayList<Card>();
Card c = new Card();
c.setCardId(card);
c.setType(type);
li.add(c);
this.list = li;
}
*/
String hql3 = "select new User(u.uname,c.type,c.cardId) from User u,Card c where (u.id = c.user.id)";
List<User> list2 = session.createQuery(hql3).list();
System.out.println(list2.get(0).getList().get(0).getCardId());
System.out.println(list2.get(1).getList().get(0).getCardId());
for(User u:list2){
System.out.println(u.getUname());
for(Card c :u.getList()){
System.out.println(c.getType() +" " + c.getCardId());
}
}
}
=======下面附上源碼下載下傳位址,自己導入hibernate4的jar包==== 點選打開連結