lhd0 2010-08-11
使用内连接(hql)
fromProductpinnerjoinCategory(错误)
fromProductpinnerjoinp.category
或者:
Stringhql="selectpfromProductp,Categorycwherep.category=c";
Stringhql="selectpfromProductp,Categorycwherep.category.id=c.id";
使用criteria
Criteriacrit=session.createCriteria(Product.class).createCriteria("category");
List<Product>list=crit.list();
使用左外连接
hql="selectcfromCategorycleftouterjoinc.productsorderbyc.id";
QBC实现左外连接
Criteriacriteria=session.createCriteria(Category.class).setFetchMode("products",FetchMode.JOIN);
使用右外连接(方言使用9,9i不支持)
hql="selectcfromCategorycrightouterjoinc.products";
使用迫切内连接(在join后面加fetch即可,左右外一样)
hql="selectcfromCategorycjoinfetchc.products";
命名的hql
在配置文件(.hbm.xml)中加入
<queryname="com.selectGuest">
<![CDATA[selectgbfromGuestBookgbwheregb.idbetween:beginand:end]]>
</query>,注意这段话加在class外面
程序中使用:Queryquery=session.getNamedQuery("com.selectGuest");
query.setInteger("begin",1);
query.setInteger("end",100);
命名的sql
<sql-queryname="com.selectGuest">
<![CDATA[select{gb.*}fromguestBookgbwheregb.id=:id]]>
<returnalias="gb"class="com.v512.Guestbook"/>
</sql-query>,注意这段话加在class外面
调用存储过程Oracle
<sql-queryname="com.selectGuest"callable="true">
<returnalias="Guestbook"class="com.v512.Guestbook"/>
{callselectGuestbookById(?,:id)}
</sql-query>,注意这段话加在class外面
使用SQL查询
Stringsql="select*fromguestbook";
SQLQuerysqlQuery=session.createSQLQuery(sql);
List<Object[]>list=sqlQuery.list();
或者sqlQuery.addScalar("id",Hibernate.INTEGER);
sqlQuery.addScalar("name",Hibernate.STRING);
sqlQuery.addScalar("email",Hibernate.String);//(注意,这儿是字段)
List<Object[]>list=sqlQuery.list();
或者sqlQuery.addEntity(Guestbook.class);
List<GuestBook>list=sqlQuery.list();
或者
Stringsql="select{p.*}fromproductp,categorycwherep.category_id=c.id";
SQLQuerysqlQuery=session.createSQLQuery(sql);
sqlQuery.addEntity("p",Product.class);
或者
sqlQuery.setResultTransformer(Transformers.aliasToBean(Product.class));
hibernater不支持直接更新或删除的存储过程
Hibernate中直接使用JDBC
Connectionconn=session.connection();
Stringprocedure="{callupdateGuestbookById(?,?)}";
try{
CallableStatementstmt=conn.prepareCall(procedure);
stmt.setInt(1,1);
stmt.setString(2,"修改了主题");
stmt.executeUpdate();
}catch(Exceptione){}