我打算从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'
    },
)

最佳答案

您可以使用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


现在,这样做意味着查询将返回对象数组的列表,其中每个数组包含一个BlogLong作为计数。您可能想使其更加类型安全。如果您编写了一个名为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对象的列表,然后您可以从中轻松检索整齐的结果。

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

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


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

10-05 17:47
查看更多