JAVA Hibernate查询方法用法集锦求助

wf1850 2011-05-25 04:23:04
getHibernateTemplate().delete(entity); 删除方法传实体,基本无异议

getHibernateTemplate().delete(entityName, entity, lockMode); 那么这个方法如何使用,其中entityName可以理解,

而lockMode呢?望高手详解......


getHibernateTemplate().update(entity);更新数据 传实体,无异议

.saveOrUpdate(entity); 大概只知道是传实体 和做增加修改有关,不知道我理解对吗?在数据库中找,找到了就做更新操 作,找不到就增加操作


.find(queryString, values) 可以理解传入hql语句+++参数组即可,比较常用


下面6个具体什么用法是做什么的,望高手详解,有具体代码分享更好


1 .findByExample(entityName, exampleEntity, firstResult, maxResults)

2 .findByCriteria(criteria, firstResult, maxResults)

3 .findByNamedParam(queryString, paramNames, values)

4 .findByNamedQueryAndNamedParam(queryName, paramNames, values)

5 .findByValueBean(queryString, valueBean)

6 . getHibernateTemplate().delete(entityName, entity, lockMode);



还有1个疑问的

1 .findByExample(entityName, exampleEntity, firstResult, maxResults)

不知道其中的entity是否支持空值,意思就是 类似删除delete(entity)方法一样,
不需要穿整个entity,只传入1个ID进实体,方法就会自动去按id删除
还有就是修改的方法 是否也那样支持呢,就是个别参数并未赋值,
就传回来一个entity进update(entity);方法

人多力量大,用法也会多种多样,请各位高手不吝教授,谢谢啦....
...全文
213 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
charles1850 2011-05-28
  • 打赏
  • 举报
回复
public List findByBlogByPage(Blog b, int pageNo)

{

int offset = (pageNo - 1) * pageSize;

return findByPage("from Comment as c where c.blog = ? order by c.id

desc", b, offset, pageSize);

}
wf1850 2011-05-26
  • 打赏
  • 举报
回复
没人回复自己偷一篇帖上
wf1850 2011-05-26
  • 打赏
  • 举报
回复
spring HibernateDaoSupport类

19.2 实现DAO组件

J2EE应用的持久层访问都是通过DAO组件来完成的,DAO组件封装了所有的数据库访问,让数据库访问与业务逻辑组件分离,从而将数据库访问逻辑和业务逻辑分离。使用DAO模式的原因是为了实现更好的分离。

本系统有两个DAO组件,这两个DAO组件都借助于Spring的DAO抽象实现。DAO接口里提供了各种方法定义,DAO实现类则对这些方法提供实现。

19.2.1 DAO接口定义

Blog DAO组件负责Blog文章的数据库访问操作,包括Blog记录的增加、删除、修改和查询等,下面是Blog DAO组件的代码:

public interface BlogDao

{

/**

* 根据主键加载Blog

* @param id 需要加载的Blog ID

* @return 加载的Blog

*/

Blog get(int id);

/**

* 保存Blog

* @param b 需要保存的Blog

*/

void save(Blog b);

/**

* 删除Blog

* @param b 需要删除的Blog

*/

void delete(Blog b);

/**

* 删除Blog

* @param id 需要删除的Blog ID

*/

void delete(int id);

/**

* 修改Blog

* @param b 需要修改的Blog

*/

void update(Blog b);

/**

* 查询指定用户、指定页的Blog

* @param pageNo 需要查询的指定页

* @return 查询到的Blog集合

*/

List findAllByPage(int pageNo);

/**

* 查询最新Blog文章的ID

* @return 最新Blog文章

*/

Blog findLastest();

}

正如前面所见的,Blog DAO接口中定义了基本的CRUD操作方法,用于完成Blog记录的增加、删除和修改等操作。除此之外,还定义了两个简单的查询方法:findAllByPage和findLastest,这两个方法分别用于查询所有的Blog文章和最新的Blog文章。查询所有的Blog文章时,提供了一个页码参数,用于控制分页。Comment DAO接口的代码如下:

public interface CommentDao

{

/**

* 根据主键加载评论

* @param id 需要加载的评论ID

* @return 加载的评论

*/

Comment get(int id);

/**

* 保存评论

* @param c 需要保存的评论

*/

void save(Comment c);

/**

* 删除评论

* @param c 需要删除的评论

*/

void delete(Comment c);

/**

* 删除评论

* @param id 需要删除的评论的ID

*/

void delete(int id);

/**

* 修改评论

* @param c 需要修改的评论

*/

void update(Comment c);

/**

* 根据评论名查找评论

* @param b 评论所对应的Blog

* @param pageNo 查找指定页的Blog

* @return 查找到的评论集合

*/

List findByBlogByPage(Blog b, int pageNo);

}

Comment DAO接口里一样定义了Blog评论的增加、删除和修改等方法,除此之外,还定义了一个查询方法:findByBlogByPage,该方法根据Blog文章和页码查询评论。

19.2.2 分页实现

本系统的查询方法都使用了分页,Spring的HibernateTemplate并未提供分页的实现,因此,这里扩展了Spring的HibernateDaoSupport类,扩展后的HibernateDaoSupport增加了3个分页查询方法,使用这3个分页查询方法可以实现分页。关于为什么选择扩展HibernateDaoSupport,而不是扩展HibernateTemplate,可以参考第15章的介绍。扩展后的HibernateDaoSupport的代码如下:

public class YeekuHibernateDaoSupport extends HibernateDaoSupport

{

/**

* 使用hql语句进行分页查询操作

* @param hql 需要查询的hql语句

* @param offset 第一条记录索引

* @param pageSize 每页需要显示的记录数

* @return 当前页的所有记录

*/

public List findByPage(final String hql,

final int offset, final int pageSize)

{

List list = getHibernateTemplate().executeFind(new HibernateCallback()

{

public Object doInHibernate(Session session)

throws HibernateException, SQLException

{

List result = session.createQuery(hql).

setFirstResult(offset).setMaxResults(pageSize).

list();

return result;

}

});

return list;

}

/**

* 使用hql语句进行分页查询操作

* @param hql 需要查询的hql语句

* @param value 如果hql有一个参数需要传入,那么value就是传入的参数

* @param offset 第一条记录索引

* @param pageSize 每页需要显示的记录数

* @return 当前页的所有记录

*/

public List findByPage(final String hql, final Object value,

final int offset, final int pageSize)

{

List list = getHibernateTemplate().executeFind(new HibernateCallback()

{

public Object doInHibernate(Session session)

throws HibernateException, SQLException

{

List result = session.createQuery(hql).

setParameter(0, value).setFirstResult(offset).

setMaxResults(pageSize).list();

return result;

}

});

return list;

}

/**

* 使用hql语句进行分页查询操作

* @param hql 需要查询的hql语句

* @param values 如果hql有多个参数需要传入,那么values就是传入的参数数组

* @param offset 第一条记录索引

* @param pageSize 每页需要显示的记录数

* @return 当前页的所有记录

*/

public List findByPage(final String hql, final Object[] values,

final int offset, final int pageSize)

{

List list = getHibernateTemplate().executeFind(new HibernateCallback()

{

public Object doInHibernate(Session session)

throws HibernateException, SQLException

{

Query query = session.createQuery(hql);

for (int i = 0; i < values.length; i++)

{

query.setParameter( i, values[i]);

}

List result = query.setFirstResult(offset).

setMaxResults(pageSize).list();

return result;

}

});

return list;

}

}

上面的YeekuHibernateDaoSupport类中提供了3个查询方法,这3个查询方法分别用于无参数的HQL查询、一个参数的HQL查询和多个参数的HQL查询。借助于这3个查询方法,可以实现查询的分页。

19.2.3 DAO组件的实现

DAO组件的实现类实现了DAO接口,继承了上面的YeekuHibernateDaoSupport类。YeekuHibernateDaoSupport是HibernateDaoSupport的子类,可以使用Spring的DAO支持。下面是BlogDaoHibernate实现类的代码:

public class BlogDaoHibernate extends YeekuHibernateDaoSupport

implements BlogDao

{

//每页显示的消息数

private int pageSize;

//每页的消息数通过依赖注入管理

public void setPageSize(int pageSize)

{

this.pageSize = pageSize;

}

/**

* 根据主键加载Blog

* @param id 需要加载的Blog ID

* @return 加载的Blog

*/

public Blog get(int id)

{

return (Blog)getHibernateTemplate().get(Blog.class, new Integer(id));

}

/**

* 保存Blog

* @param b 需要保存的Blog

*/

public void save(Blog b)

{

getHibernateTemplate().save(b);

}

/**

* 删除Blog

* @param b 需要删除的Blog

*/

public void delete(Blog b)

{

getHibernateTemplate().delete(b);

}

/**

* 删除Blog

* @param id 需要删除的Blog ID

*/

public void delete(int id)

{

getHibernateTemplate().delete(get(id));

}

/**

* 修改Blog

* @param b 需要修改的Blog

*/

public void update(Blog b)

{

getHibernateTemplate().saveOrUpdate(b);

}

/**

* 查询指定用户、指定页的Blog

* @param pageNo 需要查询的指定页

* @return 查询到的Blog集合

*/

public List findAllByPage(int pageNo)

{

int offset = (pageNo - 1) * pageSize;

return findByPage("from Blog as b order by b.id desc", offset, pageSize);

}

/**

* 查询最新Blog文章的ID

* @return 最新Blog文章

*/

public Blog findLastest()

{

List l = getHibernateTemplate().find("from Blog as b where b.id >=

(select max(b.id) from Blog as b)");

if (l == null || l.size() == 0 || l.get(0) == null)

{

return null;

}

return (Blog)l.get(0);

}

}

在上面的实现类中,除了实现DAO接口中定义的系列方法外,还提供了一个依赖注入方法,这个依赖注入方法用于注入一个pageSize变量值,这个变量值就是每页显示的记录数。

CommentDaoHibernate实现类与之类似,也提供了每页显示记录数的依赖注入方法。下面是该DAO组件实现类的代码:

public class CommentDaoHibernate extends YeekuHibernateDaoSupport

implements CommentDao

{

//每页显示的消息数

private int pageSize;

//每页的消息数通过依赖注入管理

public void setPageSize(int pageSize)

{

this.pageSize = pageSize;

}

/**

* 根据主键加载评论

* @param id 需要加载的评论ID

* @return 加载的评论

*/

public Comment get(int id)

{

return (Comment)getHibernateTemplate().get(Comment.class, new

Integer(id));

}

/**

* 保存评论

* @param c 需要保存的评论

*/

public void save(Comment c)

{

getHibernateTemplate().save(c);

}

/**

* 删除评论

* @param c 需要删除的评论

*/

public void delete(Comment c)

{

getHibernateTemplate().delete(c);

}

/**

* 删除评论

* @param id 需要删除的评论的ID

*/

public void delete(int id)

{

getHibernateTemplate().delete(get(id));

}

/**

* 修改评论

* @param c 需要修改的评论

*/

public void update(Comment c)

{

getHibernateTemplate().saveOrUpdate(c);

}

/**

* 根据评论名查找评论

* @param b 评论所对应的Blog

* @param pageNo 查找指定页的Blog

* @return 查找到的评论集合

*/

public List findByBlogByPage(Blog b, int pageNo)

{

int offset = (pageNo - 1) * pageSize;

return findByPage("from Comment as c where c.blog = ? order by c.id

desc", b, offset, pageSize);

}

}
wf1850 2011-05-25
  • 打赏
  • 举报
回复

高手在哪里啊,高手在哪里......................

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧