0

我打算从 django 切换到 Java,不要问为什么:)。我决定使用 Play Framework。我需要的是一个 ORM,它允许将面向对象的方法与本机 sql 混合。

类似于 django 的示例:https ://docs.djangoproject.com/en/1.3/ref/models/querysets/#extra

Java 世界中是否有任何东西具有这些功能?

来自 Django 的 ORM 世界的示例,两个模型:blog 和 blogEntry(1->N 关系)。我们正在选择所有包含已计数 blogEntry 元素的博客。

Blog.objects.extra(
    select={
        'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
    },
)
4

1 回答 1

1

您可以使用 JPA 执行类似的操作,它是 Java 中的标准持久性 API,使用其 JPQL 查询语言。

假设您有一个名为 的持久类Blog,它有一个名为 的属性entries,它引用了一个名为 的类的一组实例BlogEntry

您可以Blogs使用以下查询自行检索所有内容:

select b from Blog b

然后,您还可以通过entries属性加入并计算按以下方式分组的结果来检索条目计数Blog

select b, count(e) from Blog b join b.entries e group by b

现在,这样做意味着查询将返回一个对象数组列表,其中每个数组包含 aBlog和 aLong用于计数。你可能想让它更安全一点。如果您编写了一个名为的类,该类BlogWithCount具有这样的构造函数:

public BlogWithCount(Blog b, long count)

然后您可以使用构造函数表达式:

select new org.example.BlogWithCount(b, count(e)) from Blog b join b.entries e group by b

此查询返回一个BlogWithCount对象列表,然后您可以从该列表中以一种简洁的方式检索您的结果。

当我第一次写这个答案时,我认为可以编写一个更简单的计数查询版本,如下所示:

select b, count(b.entries) from Blog b

但这不起作用,至少在 Hibernate 4.1.4 中是这样。查看规范,似乎它应该可以工作,所以这可能是一个错误。我不知道。

于 2012-11-20T16:29:45.973 回答