如何在休眠中执行 .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()的主要内容,如果未能解决你的问题,请参考以下文章