`
chenchi1985
  • 浏览: 71104 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

jpa hibernate criteria query

 
阅读更多

1.JPA和Hibernate分别使用criteria api动态查询的例子

2.只选择表中的某几列的例子

3.选择统计列的例子

相比之下,Hibernate的语法要简洁的多。

 

package cn.cytong.test;

import models.OperatorLine;
import models.Order;
import org.apache.commons.lang.time.DateUtils;
import org.hibernate.FetchMode;
import org.hibernate.Session;
import org.hibernate.criterion.*;
import org.junit.Test;
import play.Logger;
import play.db.jpa.JPA;
import play.test.UnitTest;

import javax.persistence.EntityManager;
import javax.persistence.Tuple;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * User: chenchi
 * Date: 12-8-25
 * Time: 上午10:27
 * To change this template use File | Settings | File Templates.
 */
public class JpaCriteriaTest extends UnitTest {
    //    @Test
    public void testSelectMultiple() {
        EntityManager em = JPA.em();
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Tuple> sq = cb.createTupleQuery();

        Root<Order> root = sq.from(Order.class);
        // define alias to override the alias generated by the framework, In order to be same with the count query
        root.alias("o");
        sq.multiselect(root.get("id").alias("id")
                , root.get("guestName").alias("guestName")
                , root.get("mobile").alias("mobile")
                , root.get("line").get("lineName").alias("lineName"));

        Predicate where = cb.conjunction();
        where = cb.and(where, cb.like(root.<String>get("guestName"), "%%"));
        where = cb.and(where, cb.equal(root.get("startAt"), DateUtils.truncate(new Date(), Calendar.DATE)));
        sq.where(where);

        // count items
        CriteriaQuery<Long> cq = cb.createQuery(Long.class);
        Root<Order> cFrom = cq.from(Order.class);
        cFrom.alias("o");
        cq.select(cb.count(cFrom)).where(where);
        Long count = em.createQuery(cq).getSingleResult();
        Logger.info("count is %d", count);

        //  find items
        List<Tuple> tuples = em.createQuery(sq).getResultList();
        for (Tuple tuple : tuples) {
            Logger.info("id(%s)\tname(%s)\tline(%s)", tuple.get("id"), tuple.get("guestName"), tuple.get("lineName"));
        }
    }

    @Test
    public void testHibernateCriteria() {
        Session session = (Session) JPA.em().getDelegate();
        DetachedCriteria criteria = DetachedCriteria.forClass(Order.class);
        criteria.add(Restrictions.like("guestName", "", MatchMode.ANYWHERE))
                .add(Restrictions.eq("startAt", DateUtils.truncate(new Date(), Calendar.DATE)));

        Long count = (Long) criteria.getExecutableCriteria(session)
                .setProjection(Projections.rowCount())
                .uniqueResult();
        Logger.info("count is %s", count);

        criteria.setProjection(null)
                .setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
        List orders = criteria.getExecutableCriteria(session).list();
        for (Object obj : orders) {
            Order order = (Order) obj;
            Logger.info("id(%s), guest(%s), line(%s)", order.id, order.guestName, order.line.lineName);
        }
    }

    //    @Test
    public void testHibernateMultiple() {
        Session session = (Session) JPA.em().getDelegate();
        DetachedCriteria criteria = DetachedCriteria.forClass(Order.class);

        //  set restrictions
        criteria.add(Restrictions.like("guestName", "", MatchMode.ANYWHERE))
                .add(Restrictions.eq("startAt", DateUtils.truncate(new Date(), Calendar.DATE)));

        //  count
        Long count = (Long) criteria.getExecutableCriteria(session)
                .setProjection(Projections.rowCount())
                .uniqueResult();
        Logger.info("count is %s", count);

        //  select multi fields
        List<Map> rows = criteria.setProjection(Projections.projectionList()
                .add(Property.forName("id").as("id"))
                .add(Property.forName("guestName").as("guest")))
                .setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
                .getExecutableCriteria(session)
                .list();

        for (Map row : rows) {
            Logger.info("id(%s), guest(%s)", row.get("id"), row.get("guest"));
        }

    }

    //    @Test
    public void testProjection() {
        Session session = (Session) JPA.em().getDelegate();
        DetachedCriteria lineCriteria = DetachedCriteria.forClass(OperatorLine.class)
                .setProjection(Property.forName("line"))
                .add(Property.forName("operator.id").eq(2L));
        DetachedCriteria criteria = DetachedCriteria.forClass(Order.class)
                .add(Restrictions.eq("startAt", DateUtils.truncate(new Date(), Calendar.DATE)))
                .add(Property.forName("line").in(lineCriteria));

//        Long count = (Long) criteria.getExecutableCriteria(session)
//                .setProjection(Projections.rowCount()).uniqueResult();

        criteria.setProjection(Projections.projectionList()
                .add(Projections.groupProperty("state"))
                .add(Projections.groupProperty("line"))
                .add(Projections.count("state")));

        List list = criteria.getExecutableCriteria(session).list();

//        Logger.info("count is %s", count);
        Logger.info("size is %d", list.size());
    }
}
分享到:
评论
1 楼 di1984HIT 2015-08-25  
学习了,谢谢。///

相关推荐

    jpa + hibernate 例子

    5. **查询(Querying)**: JPA 提供了JPQL(Java Persistence Query Language),一种面向对象的查询语言,类似于SQL。此外,还可以使用`Criteria API`进行更复杂的查询。在JUnit测试中,可能需要验证这些查询的结果...

    velocity spring jpa hibernate 整合

    Hibernate不仅实现了JPA规范,还提供了额外的功能,如HQL(Hibernate查询语言)、 Criteria API等。它能够自动处理对象与数据库表之间的映射,使得开发者可以使用面向对象的方式来操作数据库。 在整合这四者时,...

    jpa_hibernate项目 所有jar包

    5. **查询(Query)**:JPA提供JPQL(Java Persistence Query Language),类似于SQL,用于查询实体。 **Hibernate核心概念**: 1. **Session**:类似于JPA的EntityManager,负责事务管理和对象状态管理。 2. **...

    spring-data-jpa hibernate

    - **Query Derivation**:通过方法名或者查询注解,Spring Data JPA能够自动构建SQL或HQL查询,无需手动编写SQL。 - **Pageable支持**:提供分页和排序功能,使得数据检索更灵活。 - **Integration with Spring**...

    FF.MSOL.SOA.rar_jpa hibernate_spring hibernate_spring mvc

    Hibernate不仅支持JPA规范,还增加了自己的API,如Criteria查询、HQL(Hibernate Query Language)等,使得数据库操作更加灵活和高效。此外,Hibernate还包括了实体管理、缓存机制、事务处理等功能,是Java世界中...

    JPA-Hibernate包

    **JPA(Java Persistence API)与Hibernate:关系数据库持久化框架** JPA是Java平台上的一个标准,由JSR 317定义,用于管理Java应用程序中的对象持久性。它是Oracle公司提出的,目的是为了简化Java应用程序对关系...

    Hibernate_Query查询所有数据

    CriteriaQuery&lt;YourEntityName&gt; criteriaQuery = builder.createQuery(YourEntityName.class); Root&lt;YourEntityName&gt; root = criteriaQuery.from(YourEntityName.class); TypedQuery&lt;YourEntityName&gt; typedQuery ...

    spring4.2+spring mvc +spring data+jpa+hibernate的程序构架

    Hibernate 提供了查询语言 HQL(Hibernate Query Language)和 Criteria API,方便开发者进行复杂的数据库查询。 在 `Meerkat-WEB` 文件中,我们可以期待找到项目的源代码结构,包括配置文件、Java 类(如 ...

    Hibernate_query聚合函数查询.

    在实际应用中,你还可以结合Hibernate的 Criteria 查询、Criteria API 或者 JPA 的 Query API 来实现更复杂的聚合查询,如带条件的聚合、子查询等。 总之,Hibernate提供的聚合函数使得在Java应用程序中进行数据...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    Hibernate JPA提供了JPA规范的全部功能,并且在JPA的基础上扩展了一些特性,如更强大的 Criteria 查询、HQL(Hibernate Query Language)等。Hibernate JPA因其灵活性和广泛社区支持而受到欢迎,尤其是在处理复杂...

    hibernate-jpa.jar

    6. **查询API**:除了JPQL,Hibernate还提供了Criteria API,提供了一种更加类型安全的查询方式。 使用Hibernate JPA,开发者可以利用注解驱动的编程模型,减少代码量,同时通过ORM机制,使得业务逻辑和数据访问层...

    Hibernate's JPA.rar

    标题"Hibernate's JPA.rar"表明这是一个关于使用Hibernate实现Java Persistence API (JPA)的压缩文件,可能包含示例代码、配置文件或者必要的库文件。Hibernate是一个流行的对象关系映射(ORM)框架,它使得Java...

    JPA JDBC hibernate mybatis对比

    Hibernate支持 Criteria 查询、HQL(Hibernate Query Language)等,使SQL操作更加便捷。同时,Hibernate的缓存机制和二级缓存提升了数据访问速度。但是,过度依赖Hibernate可能导致代码过于紧密地耦合到ORM层,不...

    jpa之使用hibernate示例代码

    Hibernate不仅实现了JPA规范,还提供了许多额外的功能,如二级缓存、查询语言HQL和 Criteria API等,极大地简化了Java开发人员与数据库交互的工作。 在"jpa之使用hibernate示例代码"中,我们可能会涉及以下关键知识...

    JPA_Hibernate 4.3 jar包

    Hibernate提供了一种高效、灵活的方式来将Java对象映射到数据库表,并且提供了对数据库操作的高级抽象,比如查询语言HQL(Hibernate Query Language)和 Criteria API。 **Hibernate 4.3**是Hibernate的一个版本,...

    Hibernate JPA jar包

    - **查询语言(Criteria API, JPQL)**:Hibernate JPA提供了JPQL(Java Persistence Query Language)和Criteria API两种查询方式,它们允许以面向对象的方式编写查询语句,而不是直接写SQL。 **3. MySQL数据库...

    hibernate_ jpa.jar

    《深入理解Hibernate JPA:构建高效持久层框架》 Hibernate JPA,全称为Java Persistence API,是Java领域中用于管理数据库对象的一种规范,它为Java应用程序提供了统一的ORM(对象关系映射)解决方案。Hibernate...

    JPA jar包(基于JPA的Hibernate实现)

    Hibernate不仅实现了JPA规范,还提供了一些扩展功能,如第二级缓存、查询语言HQL以及 Criteria API等,这些功能使得Hibernate在实际开发中更为强大和灵活。 在描述中提到的“hibernate4.2”,这是Hibernate的一个...

    jpa框架资源基于hibernate

    4. **查询(Querying)**: 使用JPQL(Java Persistence Query Language)或Criteria API进行对象级别的查询。 **使用JPA和Hibernate的优点**: 1. **代码简洁**: 使用面向对象的方式处理数据库操作,避免了大量的...

    JPA-Hibernate实现所需的完整Jar包

    Hibernate不仅实现了JPA规范,还提供了许多额外的功能,如二级缓存、 Criteria查询和HQL(Hibernate Query Language)。这使得Hibernate成为企业级Java应用中首选的ORM框架之一。 在使用JPA和Hibernate进行开发时,...

Global site tag (gtag.js) - Google Analytics