从 Hibernate 标准到 JPA 标准或 QueryDSL
Posted
技术标签:
【中文标题】从 Hibernate 标准到 JPA 标准或 QueryDSL【英文标题】:From Hibernate criteria to JPA criteria or QueryDSL 【发布时间】:2014-08-09 15:49:36 【问题描述】:我正在考虑将 Hibernate 标准从旧的 DAO 层移植到 JPA 标准或 QueryDSL 标准。
由于我从未使用过这两个中的任何一个,我想知道我应该使用哪个 API...
这里是休眠条件:
public Page<ElearningSubscription> findWithPatternLike(String searchPattern, int pageNumber, int pageSize)
Criteria criteria = getSession().createCriteria(getPersistentClass(), "es");
criteria.createAlias(DB_TABLE_USER_ACCOUNT, "u", CriteriaSpecification.INNER_JOIN);
Conjunction conjunction = Restrictions.conjunction();
String pattern = "%" + searchPattern + "%";
Criterion firstname = Restrictions.ilike("u.firstname", pattern);
Criterion lastname = Restrictions.ilike("u.lastname", pattern);
Criterion email = Restrictions.ilike("u.email", pattern);
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(firstname).add(lastname).add(email);
if (searchPattern.contains(" "))
String[] pieces = searchPattern.split(" ");
if (pieces[0] != null)
Criterion firstnameBis = Restrictions.ilike("u.firstname", pieces[0]);
disjunction.add(firstnameBis);
if (pieces[1] != null)
Criterion lastnameBis = Restrictions.ilike("u.lastname", pieces[1]);
disjunction.add(lastnameBis);
conjunction.add(disjunction);
OrderList orderList = new OrderList().add(Order.asc("u.firstname")).add(Order.asc("u.lastname")).add(Order.asc("u.email")).add(Order.desc("es.subscriptionDate"));
Page<ElearningSubscription> page = getPage(pageNumber, pageSize, criteria, orderList);
return page;
感谢您的指导。
亲切的问候,
斯蒂芬·艾伯特
【问题讨论】:
尝试使用这两种方法,然后选择你认为最好的。 这是主观的吗? :-) 无论如何谢谢。 【参考方案1】:JPA 2 Criteria 是官方标准,但 Querydsl 在以下方面更胜一筹
更简单、更简洁的语法 可定制的代码生成 支持多个后端这个答案是有偏见的,因为我参与了Querydsl的开发。
【讨论】:
嗨 Timo,谢谢,我刚刚评论了你的一篇博客文章 :-) 我想知道 QueryDSL 是否是 Spring Data 环境中的类型。我估计是..?那我试试那条路。现在将寻找一个教程。干杯! 蒂莫,如果你有几分钟的时间,我的鞋子里有一块小石头已经好几天了,这是一个让我回避的不同问题......***.com/questions/25221495/… 发现 QueryDSL 是类型安全的 manuel-palacio.blogspot.fr/2011/01/… :-) 是的,Querydsl 是类型安全的,给定的答案看起来足以解决您的其他 SO 问题。 我在两个框架中编写了一个中等复杂度的查询来检查它们。 JPA 2 Criteria 是使用许多不同类的大量代码。写起来很麻烦,读起来也很困难。 QueryDSL 只需要你创建一个JPAQueryFactory
传递entityManager
实例,然后你就可以开始非常流畅地编写一个易于阅读的查询。所以我们决定选择 QueryDSL。以上是关于从 Hibernate 标准到 JPA 标准或 QueryDSL的主要内容,如果未能解决你的问题,请参考以下文章