我有一個表: 用戶的列:{ID,姓名,地址}休眠負載所選列
我想用Hibernate來從該表中只選擇ID。但我不想使用HQL進行原生SQL查詢。我想使用Criteria對象。有沒有辦法做到這一點?
感謝,
肖恩·阮
我有一個表: 用戶的列:{ID,姓名,地址}休眠負載所選列
我想用Hibernate來從該表中只選擇ID。但我不想使用HQL進行原生SQL查詢。我想使用Criteria對象。有沒有辦法做到這一點?
感謝,
肖恩·阮
是。您必須使用投影:
Criteria c = session.createCriteria(User.class, "u");
c.setProjection(Projections.property("u.id"));
return c.list(); // the list of all the user IDs
但是HQL對於這種查詢更具可讀性和直觀性。標準是動態生成的查詢有用,或者重用查詢的部分在若干個:
return session.createQuery("select u.id from User u").list();
它可以使用ResultTransformer適用於原生SQL查詢,允許其返回非管理的實體。
爲例,說我們有像下面
@Entity
@Table(name = "demodetail")
public class EntDemodetail {
Integer id;
String description;
Integer demoid;
EntDemo demo;
@Id
@GeneratedValue
@Column(name = "id_detail", unique = true, nullable = false)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="detaildesc")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Column(name="demoid")
public Integer getDemoid() {
return demoid;
}
public void setDemoid(Integer demoid) {
this.demoid = demoid;
}
@OneToOne()
@JoinColumn(name="demoid")
public EntDemo getDemo() {
return demo;
}
public void setDemo(EntDemo demo) {
this.demo = demo;
}
}
你可以閱讀這個實體的一些列像下面
/* Method to READ some columns of an entity with native sql */
public void nativesqlwithresulttransformer(){
Session session = HibernateUtilMysql.getSessionFactory().openSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
String sql = "SELECT id_detail as id FROM demodetail d"; //
SQLQuery query = session.createSQLQuery(sql);
List results = query.setResultTransformer(Transformers.aliasToBean(EntDemodetail.class)).list();
for (Iterator iterator =
results.iterator(); iterator.hasNext();){
EntDemodetail entdemodetail = (EntDemodetail) iterator.next();
System.out.print("Id: " + entdemodetail.getId());
//System.out.print("Desc: " + entdemodetail.getDescription());
}
tx.commit();
}catch (HibernateException e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}
}
更多信息entdemodetail實體,你可以看到http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/querysql.html
或者使用c.setProjection(Projections.id()); – 2012-08-16 03:51:49