Hibernate中执行SQL语句的方法


在使用hibernate的时候,有的时候需要用sql语句来执行,而HibernateDaoSupport方便了操作后,执行sql时候遇到不能执行的问题,
下列方法是一个内部类来执行sql,可以写一个通用方法来执行sql,通常如果没有必要尽量不使用sql,但是有的时候就必须使用了,就想下列的查询分组查询,不想在hibernate中使用一对多关系,而又必须使用group by 哪么只能使用下列方式,
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public List<KnowledgeQueryBean> getKnowledgeQueryInfo() {
List<KnowledgeQueryBean> ListAll = new ArrayList<KnowledgeQueryBean>();
final String sql = "SELECT ky.KNOWLEDGEQUERYID,ky.TITILE,ky.CREATEDATE,eu.USERNAME ,ky.USERID,COUNT(kyr.KNOWLEDGEQUERYID) AS COUNT"+
" FROM KNOWLEDGEQUERY ky LEFT JOIN KNOWLEDGEQUERYANSWER kyr ON ky.KNOWLEDGEQUERYID = kyr.KNOWLEDGEQUERYID" +
" LEFT JOIN EOM_USER eu ON ky.USERID = eu.USER_ID"+
" GROUP BY ky.KNOWLEDGEQUERYID,ky.TITILE,ky.CREATEDATE,eu.USERNAME,ky.USERID ORDER BY ky.CREATEDATE DESC";
ListAll = (List<KnowledgeQueryBean>)this.getHibernateTemplate().execute(
new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Connection con = session.connection();
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
List<KnowledgeQueryBean> all = new ArrayList<KnowledgeQueryBean>();
while(rs.next()){
KnowledgeQueryBean kqb = new KnowledgeQueryBean();
kqb.setKnowledgeQueryId( rs.getLong("KNOWLEDGEQUERYID"));
kqb.setTitle(rs.getString("TITILE"));
kqb.setCreateDate(rs.getDate("CREATEDATE"));
kqb.setContent(rs.getString("USERNAME"));
kqb.setUserId(rs.getLong("USERID"));
kqb.setCount(rs.getInt("COUNT"));
all.add(kqb);
}
rs.close();
ps.close();
session.flush();
session.close();
return all;
}
}
);
return ListAll;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!针对您的问题,使用Hibernate的session执行任意SQL语句以及整个事务,我可以给出如下回答: 1. 执行任意SQL语句Hibernate,我们可以通过使用Session对象的createSQLQuery()方法执行任意的SQL语句。该方法返回一个SQLQuery对象,我们可以通过该对象的setString()、setInteger()等方法设置参数,并通过list()、uniqueResult()等方法获取执行结果。以下是一个示例: ``` Session session = sessionFactory.openSession(); SQLQuery query = session.createSQLQuery("SELECT * FROM user WHERE id = :id"); query.setInteger("id", 1); List<Object[]> results = query.list(); for (Object[] result : results) { // 处理查询结果 } session.close(); ``` 2. 执行整个事务 在Hibernate,我们可以通过使用Transaction对象来执行整个事务。在一个事务,我们可以执行多个数据库操作,并可以通过commit()、rollback()方法来提交或回滚事务。以下是一个示例: ``` Session session = sessionFactory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); // 执行数据库操作 tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } throw e; } finally { session.close(); } ``` 在上述示例,我们首先通过Session对象打开一个数据库连接,然后创建一个Transaction对象。在try块,我们执行数据库操作,并通过调用commit()方法来提交事务。如果在执行数据库操作时出现异常,则在catch块调用rollback()方法来回滚事务。最后,我们在finally块关闭数据库连接。 希望以上回答能够对您有所帮助!如果您有任何其他问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值