`
sublun
  • 浏览: 3429 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

Hibernate distinct 查询的多种实现方式

阅读更多
这里只是简单的写两个方式。
一个是使用Criteria
一个是使用HQL Query

一:Criteria (下面的代码用不上事务的处理,代码片段中的事务只是一个为了保证事务的完整性而使用的一个标准格式化的代码片段。为了保持风格的统一,对于查询片段也使用了事务处理格式。虽然Spring本身提供了事务管理,但是对于简单事务来讲,直接处理的效率比较高,可读性与可控性也强一些。)

    getHibernateTemplate().execute(
        new HibernateCallback<Object>() {
            public Object doInHibernate(Session session)
                throws HibernateException, SQLException {

                Object ret = null;

                Transaction tx = session.beginTransaction();
                try {

                    Criteria crit = session.createCriteria(Diary.class);
                    // 这行将对occasion进行唯一性合并
                    crit.setProjection(Projections.distinct(Projections.property("occasion")));
                    crit.createAlias("mission", "mission", Criteria.LEFT_JOIN);
                    crit.addOrder(Order.asc("occasion"));
                    ret = crit.list();

                    tx.commit();
                } catch (Exception e) {
                    if (null != tx) {
                        tx.rollback();
                    }
                    e.printStackTrace();
                    if (e instanceof HibernateException)
                        throw (HibernateException) e;
                    if (e instanceof SQLException)
                        throw (SQLException) e;
                }

                return ret;
            };
        });

二:HQL Query(关于事务的管理同上。)
    getHibernateTemplate().execute(new HibernateCallback<Recommendation>() {

        @Override
        public Recommendation doInHibernate(Session session)
            throws HibernateException, SQLException {

            Object ret = null;

            Transaction tx = session.beginTransaction();
            try {

                // 当查询的结果集中只存在Recommendation对象时,distinct将结果集中的相同
                // 对象合并成一个,如果left join fetch导致结果集中Recommendation对象与多个其它对象
                // 造成查询结果的记录行不相同,则distinct无法对Recommendation对象合并。
                String hql = "select distinct r from Recommendation r ";
                hql += " left join fetch r.carries c left join fetch c.diary d ";
                hql += " left join fetch r.prospectuses ps left join fetch ps.prospectus p ";
                hql += " left join fetch p.policyTerms pt left join fetch pt.cover ";
                hql += " where r.status=3503 or r.status=3504 ";
                Query q = session.createQuery(hql);
                Object lst = q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();

                tx.commit();
            } catch (Exception e) {
                if (null != tx) {
                    tx.rollback();
                }
                e.printStackTrace();
                if (e instanceof HibernateException)
                    throw (HibernateException) e;
                if (e instanceof SQLException)
                    throw (SQLException) e;
            }

            return lst;
        }
    });
分享到:
评论

相关推荐

    hibernate 中HQL语句查询学习笔记

    **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及关联关系的查询。 ##### 默认数据库表和数据 在本文档...

    Hibernate中Criteria的用法

    而在Hibernate提供的多种查询方式中,Criteria API是一种非常灵活且强大的查询工具,它支持复杂的条件组合以及分组、排序等功能,为开发者提供了更为方便的查询手段。 #### 二、Criteria简介 Criteria是Hibernate...

    安博Hibernate最全培训资料内部版

    通过对以上内容的学习,可以了解到Hibernate不仅提供了一种强大的ORM解决方案,还为开发者提供了多种查询方式以适应不同的需求场景。无论是HQL还是Criteria接口,都有各自的特点和适用场景,开发者可以根据实际项目...

    hibernate 框架的基础四

    在进行多表检索时,HQL提供了多种连接方式,包括内连接、外连接等。 ##### 内连接 内连接用于返回两个或多个表中匹配行的数据。在HQL中可以使用 **显式内连接** 和 **隐式内连接**。 - **显式内连接**: - 使用 ...

    HQL经典查询语句[文].pdf

    HQL是Hibernate提供的面向对象的查询语言,它允许开发者以类和属性的方式来查询数据库,而不是直接使用SQL。本文将深入探讨HQL的经典查询语句,帮助开发者更好地理解和运用这一强大的查询工具。 首先,HQL支持过滤...

    进阶查询herbinate

    在使用Hibernate进行数据操作时,`Criteria` API是一种灵活且强大的查询方式。它允许我们根据不同的条件构造复杂的查询语句,而无需直接编写SQL。在标题和描述中提到的“进阶查询herbinate”实际上是指使用Hibernate...

    hql查询语句

    在Java开发领域,尤其是使用Struts、Spring和Hibernate框架构建应用程序时,HQL(Hibernate Query Language)是一种强大的工具,用于处理对象关系映射(ORM)的数据库查询。HQL是面向对象的,允许开发者以类和对象的...

    java_软件工程师面试题

    为了实现这一目标,开发者可以使用`Criteria` API中的`setResultTransformer`方法,将查询结果转换器设置为`Criteria.DISTINCT_ROOT_ENTITY`。这一操作会确保查询结果中只包含唯一的实体对象,即使这些对象可能在...

    Java面试可能问的问题.docx

    4. **Spring的优越性**:Spring框架简化了Java企业级应用的开发,提供IoC和AOP特性,支持声明式事务管理,具有丰富的数据访问集成,以及与多种持久层框架的良好集成,例如JDBC、Hibernate、MyBatis等。 5. **...

    支持多数据库的ORM框架ef-orm.zip

    例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样的方法来描述一个不以主键为条件的update/select/...

    oracle基础练习.docx

    在SQL操作中,Oracle支持多种查询技巧,如查询不重复的列值、别名设定、排序和条件过滤。例如,`select distinct stuName,stuAge from student`可以获取学生姓名和年龄的唯一组合。`create table`语句用于创建新表,...

    java方面的知识总结

    - `SELECT DISTINCT(字段名) FROM 表名`:去除重复记录。 - `WHERE`子句:用于筛选记录,支持多种比较运算符如`=`、`!=`、`&lt;&gt;`、`、`、`&gt;`、`&gt;=`、`BETWEEN`、`AND`、`OR`、`NOT`、`IS NULL`、`LIKE`等。 - `...

Global site tag (gtag.js) - Google Analytics