【问题标题】:How to do a .filter() in hibernate如何在休眠中执行 .filter()
【发布时间】: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,它会为您自动生成查询。
  • 不需要弹簧(多年以来)

标签: java hibernate


【解决方案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】:

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

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

    【讨论】:

    • 至少链接到现代文档。 Hibernate 3.3 已有 10 年历史,不支持大多数最佳实践,如普遍泛型。
    • @chrylis 更新了链接,因为链接他的全部目的是为他提供总体思路。
    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多