如何在休眠中执行 .filter()

Posted

技术标签:

【中文标题】如何在休眠中执行 .filter()【英文标题】:How to do a .filter() in hibernate 【发布时间】:2018-12-06 21:35:33 【问题描述】:

在 django orm 中,我可以执行以下操作:

people = Person.objects.filter(first_name='david')
for person in people:
    print person.last_name

我将如何在 Java Hibernate 的 orm 中做同样的事情?到目前为止,我已经能够执行一次获取,但不能执行过滤子句:

Person p = session.get(Person.class, "david");

什么是正确的方法呢?

【问题讨论】:

如果你想在hibernate中编程(我个人建议JPA),读python书?一种语言的成语不是其他语言的成语 Java 中很少有“活动记录”库。但这与 JPA 完全不同的概念 @JacekCz 好的——那么完成上述任务的最佳方法是什么?做 HQL 查询? 您应该使用 JPA(标准化版本,现在是 Hibernate 的官方首选接口),并且根据您的应用程序,可能是 Spring Data,它会为您自动生成查询。 不需要弹簧(多年以来) 【参考方案1】:

您可以使用本机 SQL

session.beginTransaction();
Person p = getSingleResult(session.createNativeQuery("SELECT * FROM People where name = 'david'",Person.class));
session.getTransaction().commit();

函数 getSingleResult 会是这样的:

public static <T> T getSingleResult(TypedQuery<T> query) 
        query.setMaxResults(1);
        List<T> list = query.getResultList();
        if (list == null || list.isEmpty()) 
            return null;
        
        return list.get(0);
    

你可以得到这样的列表:

List<Person> list = session
    .createNativeQuery("SELECT * FROM People", Person.class)
    .getResultList();

【讨论】:

【参考方案2】:

有几种方法可以做到这一点:

懒惰的方式 - 如果你有大量数据可能会很糟糕,只是加载 整个人员列表,流式传输并对其应用过滤器 过滤掉与给定名字不匹配的对象。 使用 HQL 查询(Hibernate 查询语言)创建选择查询 https://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/chapters/query/hql/HQL.html 使用 Hibernate 的 Criteria API 来实现上述 https://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/chapters/query/criteria/Criteria.html

您甚至可以使用本机 SQL 查询来执行上述操作。

【讨论】:

至少链接到现代文档。 Hibernate 3.3 已有 10 年历史,不支持大多数最佳实践,如普遍泛型。 @chrylis 更新了链接,因为链接他的全部目的是为他提供总体思路。

以上是关于如何在休眠中执行 .filter()的主要内容,如果未能解决你的问题,请参考以下文章

如何使用休眠执行 sql-script 文件?

Linux 休眠,挂起(待机),关机等几个命令的区别及如何实现;如何启用Ubuntu的休眠模式

如何使用类属性映射休眠中的列?

如何在休眠中进行乐观锁定

如何仅使用一个连接在休眠中进行嵌套事务?

如何让R执行暂停,休眠,等待X秒?