我打算从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
现在,这样做意味着查询将返回对象数组的列表,其中每个数组包含一个
Blog
和Long
作为计数。您可能想使其更加类型安全。如果您编写了一个名为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中不起作用。查看该规范,似乎它应该可以工作,所以这可能是一个错误。我不确定。