从 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的主要内容,如果未能解决你的问题,请参考以下文章

JPA(Hibernate)

hibernate_@GeneratedValue

如何在pojo中用jpa或hibernate映射json字段?

JPA和Hibernate的关系

hibernate注解与jpa注解

01-hibernate注解:类级别注解准备工作