今日工作:今日完成Hibernate的一些練習,看了 一些Hibernate的書籍,理解一些細節。
問題:使用hql查詢的時候出現類型轉換錯誤
String hql = "SELECT new Product(p.id, p.name) from Product p";
查出來是java.lang.Object,導致類型轉換異常。
解決辦法:
Hibernate 使用查詢部分字段,有三種字現方式:
第一種是使用高級查詢DetachedCriteria實現,代碼如下:
String alias = "user_"; //查詢時的table別名
DetachedCriteria dc = DetachedCriteria.forClass(User.class,alias);
ProjectionList pList = Projections.projectionList();
pList.add(Projections.property(alias + "." + "id").as("id"));
pList.add(Projections.property(alias + "." + "name").as("name"));
pList.add(Projections.property(alias + "." + "age").as("age"));
pList.add(Projections.property(alias + "." + "sex").as("sex"));
dc.setProjection(pList);
dc.setResultTransformer(Transformers.aliasToBean(User.class));
resultList = memberService.findByDetached(dc).size();
第二種方式是通過HQL語句new POJO()實現,方法如下:
實體類:
package com.my.model;
/**
* 產品實體類
*/
public class Product {
private Integer id;
private String name;
private Float price;
private String address;
public Product() {
super();
}
// HQL 部分字段查詢,需要使用構造函數(必須)
// 使用 String hql = "SELECT new Product(p.id, p.name) from Product p"查詢;
public Product(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Product(String name, Float price, String address) {
super();
this.name = name;
this.price = price;
this.address = address;
}
public Product(Integer id, String name, Float price, String address) {
super();
this.id = id;
this.name = name;
this.price = price;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Product [id=" + id + ", name=" + name + ", price=" + price + ", address=" + address + "]";
}
}
查詢代碼: /*
* 直接使用查詢的代碼
* 使用的hql
*/
@Test
public void testQuery() {
Session session = sessionFactory.openSession();
Transaction trans = session.beginTransaction();
String hql = "SELECT new Product(p.id, p.name) from Product p";
List<Product> list= session.createQuery(hql).list();
for(Product p:list){
System.out.println(p);
}
trans.commit();
session.close();
}
第三種方式是通過HQL語句實現,類似SQL,方法如下:
String hql = "select id,name from Product";
Query query = session.createQuery(hql);
//默認查詢出來的list裏存放的是一個Object數組,還需要轉換成對應的javaBean。
List<Object[]> links = query.list();
for(Object[] link : links){
String id = link[0];
String name = link[1];
System.out.println(id + " : " + name);
}
明日計劃:明日計劃完成Hibernate的註解配置,學習幾種實體之間的關係映射。