A. 各位大侠们,hibernate怎么完成动态生成sql语句的啊
Hibernate3支持DetachedCriteria,这是一个非常有意义的特性!我们知道,在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询。针对这种需求,对于分层应用程序来说,Web层需要传递一个查询的条件列表给业务层对象,业务层对象获得这个条件列表之后,然后依次取出条件,构造查询语句。这里的一个难点是条件列表用什么来构造?传统上使用Map,但是这种方式缺陷很大,Map可以传递的信息非常有限,只能传递name和value,无法传递究竟要做怎样的条件运算,究竟是大于,小于,like,还是其它的什么,业务层对象必须确切掌握每条entry的隐含条件。因此一旦隐含条件改变,业务层对象的查询构造算法必须相应修改,但是这种查询条件的改变是隐式约定的,而不是程序代码约束的,因此非常容易出错。DetachedCriteria可以解决这个问题,即在web层,程序员使用DetachedCriteria来构造查询条件,然后将这个DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后,可以在session范围内直接构造Criteria,进行查询。就此,查询语句的构造完全被搬离到web层实现,而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,非常完美!这恐怕也是以前很多企图在web层代码中构造HQL语句的人想实现的梦想吧!示例代码片段如下:web层程序构造查询条件:java代码:DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));Department和Employee是一对多关联,查询条件为:名称是“department”开发部门;
部门里面的雇员年龄大于20岁;业务层对象使用该条件执行查询:java代码:detachedCriteria.getExecutableCriteria(session).list();最大的意义在于,业务层代码是固定不变的,所有查询条件的构造都在web层完成,业务层只负责在session内执行之。这样代码就可放之四海而皆准,都无须修改了。然而Spring和Hibernate3的DetachedCriteria有不兼容的问题,因此在Spring环境下面使用Hibernate3需要注意:Spring的HibernateTemplate提供了Hibernate的完美封装,即通过匿名类实现回调,来保证Session的自动资源管理和事务的管理。其中核心方法是:java代码:HibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
....
}
}回调方法提供了session作为参数,有了session,就可以自由的使用Hibernate API编程了。使用了spring的之后,代码修改如下:web层代码:java代码:DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20)));
departmentManager.findByCriteria(detachedCriteria);构造detachedCriteria,作为参数传递给departmentManager业务层代码使用spring,DepartmentManager的findByCriteria如下:java代码:public List findByCriteria(final DetachedCriteria detachedCriteria) {
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
}
});
}实际上也就是:java代码:Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list(); 而已但是该程序代码执行,会抛出强制类型转换异常!我跟踪了一下spring和Hibernate源代码,原因如下:spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数,但是实际上,默认情况下,HibernateTemplate传递给回调接口的session并不是org.hibernate.impl.SessionImpl类,而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类,HibernateTemplate的注释说明,Proxy提供了一些额外的功能,包括自动设置Cachable,Transaction的超时时间,Session资源的更积极的关闭等等。java代码:private boolean exposeNativeSession = false;
... execute方法内部:Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));但是遗憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl,但是spring传过来的却是一个Proxy类,因此就报错了。java代码:public Criteria getExecutableCriteria(Session session) {
impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring传递的是Proxy
return impl;
}解决方法,禁止Spring的HibernateTemplate传递Proxy类,强制要求它传递真实的SessionImpl类,即给exexute方法增加一个参数,提供参数为true,如下:java代码:public List findByCriteria(final DetachedCriteria detachedCriteria) {
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
}
}, true);
}
B. hibernate如何执行原生sql插入 即用hibernate执行insert into table values();
首先帮你要知道,有很多技术框架可以的。就说通过通过hibernate的ORM吧。
写个POJO类,再调用它的对象,PO;
创建session对象,
Session s=HibernateSessionFactory.getSession();
s.save(PO);
Transaction tx=s.beginTransaction();
tx.commit();
C. SSH中HibernateDaoSupport执行sql语句
用到HibernateDaoSupport,当this.getHibernateTemplate().save() 的时候会默认返回一个值的,不过这个值是序列类型,需要先.toStirng()然后在Integer.parseInt("")转化成整型,这个最后的值就是最新的ID了。
D. hibernate对SQL语句的使用
如下代码:
(注意该类继承自HibernateDaoSupport ,要在applicationContext.xml中将sessionFactory注入此类中)
public class DaoUtil extends HibernateDaoSupport {
public Object executeMySQL(final String sql){
System.out.println(sql);
return getHibernateTemplate().execute( new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Connection CurConn = session.connection();
PreparedStatement ps = CurConn.prepareStatement(sql);
ps.execute();
ps.close();
session.flush();
return null;
}
} );
}
public Object executeBetchSQL(final ArrayList sqlList){
return getHibernateTemplate().execute( new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Connection CurConn = session.connection();
int count = sqlList.size();
for(int i=0;i//System.out.println(sqlList.get(i));
PreparedStatement ps = CurConn.prepareStatement(sqlList.get(i));
ps.execute();
ps.close();
session.flush();
}
return null;
}
} );
}
public static DaoUtil getFromApplicationContext(
ApplicationContext ctx) {
return (DaoUtil) ctx.getBean("DaoUtil");
}
}
E. Hibernate 怎样 执行sql语句,获得查询到的值
这个你都要纠结嘛。。直接声明一个int 类型的 变量来接收这个值就可以了,我一般都是把这个写在一个方法里面,这个方法的返回值为Int 在这个方法里面,取出这个值,返回即可。
F. hibernate执行SQL小问题~~高分
1、Hibernate在用hql查询的时候 可以返回存储持久对象(PO)的list接口.比如 执行HQL:
from User where 1=1
它就返回一个转载持久对象User的list
2、但是用sql查询的时候它是不会返回一个持久对象的list的.它只会一个装载object[]类型的list接口。
比如执行SQL:
select id,username,password from user where 1=1
List list = null;
try {
list = .exeSql("select id,username,password from User");
//注意这个sql返回的是一个List<Object[]>对象
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(Object[] o:list){ //强制转化为object[]对象,数组的长度区决于你的sql查询多少个列的数据.....
System.out.print(((Integer)o[0])+"\t"); //假设你的id为整数
System.out.print(((String)o[1])+"\t"); //username 强制转化为String对象
System.out.println(((String)o[2])); //password强制转化为String对象
}
G. hibernate执行sql语句问题
HQL执行语句:
update A(对象) set A.a(对象.属性) = "12" where A(对象.属性) = "car1"
SQL执行语句:
update A(表名) set a(字段名) = "12" where car(字段名) = "car1"
就我知道暂时两种执行方式
H. hibernate怎么调用自己的sql语句
我写个简单的例子,楼主可以参考下public int getLogin(String username,String password)
{ String sql="select * from user_table where username=? and password=?";
SQLQuery query=getSession().createSQLQuery(sql).addEntity(UserTable.class);
query.setString(0,username);
query.setString(1,password);
return Integer.parseInt(query.uniqueResult().toString());
}
public static void main(String[] args) {
new UserTableDAO().getLogin("zhang","yuan");
}