package com.bjpowernode.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory factory;
//static只初始化一次.
static
{
try{
//默认读取的是hibernate.cfg.xml 文件.
Configuration cfg = new Configuration().configure();
//建立SessionFactory.
factory = cfg.buildSessionFactory();
}catch(Exception e )
{
e.printStackTrace();
}
}
public static Session getSession()
{
//打开session.
return factory.openSession();
}
//关闭session.
public static void closeSession(Session session)
{
//判断是否为空.
//判断是否是打开状态再进行关闭.
if(session!=null)
{
if(session.isOpen())
{
session.close();
}
}
}
//返回工厂类.
public static SessionFactory getSessionFactory()
{
return factory;
}
}
session的增删改查:
增:
session.save(user);
删:
session.delete(user);
改:
session.update(user);
查:
Queryquery = session.createQuery("from User");
ListuserList = query.list();
hibernate使用sql查询:
注意newHibernateCallback<Integer>()中的类型跟内部类返回值类型一致
public List<Object[]> getRoles(){
return getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query q = session.createSQLQuery("select Role_Id, RoleDescription, RoleName from dbo.Role");
return q.list();
}
});
}
/**
* 标记公告已读
* @param userId
* @param noticeId
* @return
*/
public Integer markReadOver(final int userId,final int noticeId){
final String sql_update_info="update REL_NOTICE_USERINFO set READ_OVER=? where NOTICE_ID=? and USER_ID=?";
return getHibernateTemplate().execute(new HibernateCallback<Integer>()
{
@Override
public Integer doInHibernate(Session session) throws HibernateException,
SQLException
{
int count=session.createSQLQuery(sql_update_info)
.setInteger(0, 1)
.setInteger(1, noticeId)
.setInteger(2, userId)
.executeUpdate();
return count;
}
});
}
hibernate中sql参数绑定:
1.参数名称前面的冒号表示这是一个具名参数。
String queryString = "from Item item where item.description like :search";
uery q = session.createQuery(queryString).setString("search",searchString);
2.定位参数
String queryString = "from Item item where item.description like ? and item.date > ?";
Query q = session.createQuery(queryString).setString(0,searchString).setDate(1,minDate);
绑定参数位置的每一个变化都需要改变参数绑定代码,这样就产生了易碎和更需要维护的代码,建议避免使用定位
参数。如果必须使用定位参数,要记住hibernate是从0开始计数(JPA是从1开始记数);
3.查询有外键关联的表中的信息:
4、hibernate查询不区分大小写 HQL Criteria/** * 查询未批阅的用户 * @param readOver * @return */ public List<RelNoticeUserInfo> selectUserInfoByParam(final int readOver,final int noticeId){ return getHibernateTemplate().execute(new HibernateCallback<List<RelNoticeUserInfo>>() { @Override public List<RelNoticeUserInfo> doInHibernate(Session session) throws HibernateException, SQLException { Criteria cri = session.createCriteria(RelNoticeUserInfo.class); cri.add(Expression.eq("readOver", readOver)); cri.createAlias("eduNotice", "e"); //根据id查询关联表中所有信息 cri.add(Restrictions.eq("e.noticeId",noticeId)); List<RelNoticeUserInfo> resultList= cri.list(); return resultList; } }); }
5、sql与hql的区别:如果是使用HQL,可以使用lower或者upper函数来实现 例1:from User u where lower(u.username)=lower(’Mp3′) 这样就可以查出来mp3,mP3等用户了! 例2:String hql = "select distinct userName from User where upper(userName) like upper('%" + userName + "%')"; 如果使用Criteria,首先使用Restrictions创建Criterion 如果是字符串相等匹配Restrictions.eq(’username’,'mp3′).ignoreCase() 如果是字符串模糊匹配Restrictions.ilike(’username’,'mp3′)或者Restrictions.like(’username’,'mp3′).ignoreCase()
sql 面向数据库表查询 hql 面向对象查询 hql : from 后面跟的 类名+类对象 where 后 用 对象的属性做条件 并且hql(前面提到它是OO的)中那么对象类的名称和属性确实大小写敏感的(符合java编程语法)。 sql: from 后面跟的是表名 where 后 用表中字段做条件 查询 在Hibernate中使用查询时,一般使用Hql查询语句。 HQL(Hibernate Query Language),即Hibernate的查询语言跟SQL非常相像。不过HQL与SQL的最根本的区别,就是它是面向对象的。