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());
}
}
分享到:
相关推荐
5. **查询(Querying)**: JPA 提供了JPQL(Java Persistence Query Language),一种面向对象的查询语言,类似于SQL。此外,还可以使用`Criteria API`进行更复杂的查询。在JUnit测试中,可能需要验证这些查询的结果...
Hibernate不仅实现了JPA规范,还提供了额外的功能,如HQL(Hibernate查询语言)、 Criteria API等。它能够自动处理对象与数据库表之间的映射,使得开发者可以使用面向对象的方式来操作数据库。 在整合这四者时,...
5. **查询(Query)**:JPA提供JPQL(Java Persistence Query Language),类似于SQL,用于查询实体。 **Hibernate核心概念**: 1. **Session**:类似于JPA的EntityManager,负责事务管理和对象状态管理。 2. **...
- **Query Derivation**:通过方法名或者查询注解,Spring Data JPA能够自动构建SQL或HQL查询,无需手动编写SQL。 - **Pageable支持**:提供分页和排序功能,使得数据检索更灵活。 - **Integration with Spring**...
Hibernate不仅支持JPA规范,还增加了自己的API,如Criteria查询、HQL(Hibernate Query Language)等,使得数据库操作更加灵活和高效。此外,Hibernate还包括了实体管理、缓存机制、事务处理等功能,是Java世界中...
**JPA(Java Persistence API)与Hibernate:关系数据库持久化框架** JPA是Java平台上的一个标准,由JSR 317定义,用于管理Java应用程序中的对象持久性。它是Oracle公司提出的,目的是为了简化Java应用程序对关系...
CriteriaQuery<YourEntityName> criteriaQuery = builder.createQuery(YourEntityName.class); Root<YourEntityName> root = criteriaQuery.from(YourEntityName.class); TypedQuery<YourEntityName> typedQuery ...
Hibernate 提供了查询语言 HQL(Hibernate Query Language)和 Criteria API,方便开发者进行复杂的数据库查询。 在 `Meerkat-WEB` 文件中,我们可以期待找到项目的源代码结构,包括配置文件、Java 类(如 ...
在实际应用中,你还可以结合Hibernate的 Criteria 查询、Criteria API 或者 JPA 的 Query API 来实现更复杂的聚合查询,如带条件的聚合、子查询等。 总之,Hibernate提供的聚合函数使得在Java应用程序中进行数据...
Hibernate JPA提供了JPA规范的全部功能,并且在JPA的基础上扩展了一些特性,如更强大的 Criteria 查询、HQL(Hibernate Query Language)等。Hibernate JPA因其灵活性和广泛社区支持而受到欢迎,尤其是在处理复杂...
6. **查询API**:除了JPQL,Hibernate还提供了Criteria API,提供了一种更加类型安全的查询方式。 使用Hibernate JPA,开发者可以利用注解驱动的编程模型,减少代码量,同时通过ORM机制,使得业务逻辑和数据访问层...
标题"Hibernate's JPA.rar"表明这是一个关于使用Hibernate实现Java Persistence API (JPA)的压缩文件,可能包含示例代码、配置文件或者必要的库文件。Hibernate是一个流行的对象关系映射(ORM)框架,它使得Java...
Hibernate支持 Criteria 查询、HQL(Hibernate Query Language)等,使SQL操作更加便捷。同时,Hibernate的缓存机制和二级缓存提升了数据访问速度。但是,过度依赖Hibernate可能导致代码过于紧密地耦合到ORM层,不...
Hibernate不仅实现了JPA规范,还提供了许多额外的功能,如二级缓存、查询语言HQL和 Criteria API等,极大地简化了Java开发人员与数据库交互的工作。 在"jpa之使用hibernate示例代码"中,我们可能会涉及以下关键知识...
Hibernate提供了一种高效、灵活的方式来将Java对象映射到数据库表,并且提供了对数据库操作的高级抽象,比如查询语言HQL(Hibernate Query Language)和 Criteria API。 **Hibernate 4.3**是Hibernate的一个版本,...
- **查询语言(Criteria API, JPQL)**:Hibernate JPA提供了JPQL(Java Persistence Query Language)和Criteria API两种查询方式,它们允许以面向对象的方式编写查询语句,而不是直接写SQL。 **3. MySQL数据库...
《深入理解Hibernate JPA:构建高效持久层框架》 Hibernate JPA,全称为Java Persistence API,是Java领域中用于管理数据库对象的一种规范,它为Java应用程序提供了统一的ORM(对象关系映射)解决方案。Hibernate...
Hibernate不仅实现了JPA规范,还提供了一些扩展功能,如第二级缓存、查询语言HQL以及 Criteria API等,这些功能使得Hibernate在实际开发中更为强大和灵活。 在描述中提到的“hibernate4.2”,这是Hibernate的一个...
4. **查询(Querying)**: 使用JPQL(Java Persistence Query Language)或Criteria API进行对象级别的查询。 **使用JPA和Hibernate的优点**: 1. **代码简洁**: 使用面向对象的方式处理数据库操作,避免了大量的...
Hibernate不仅实现了JPA规范,还提供了许多额外的功能,如二级缓存、 Criteria查询和HQL(Hibernate Query Language)。这使得Hibernate成为企业级Java应用中首选的ORM框架之一。 在使用JPA和Hibernate进行开发时,...