java - 如何合并两个 Hibernate 查询?

标签 java hibernate grails hql

我需要合并两个不同查询的结果,以便按创建日期对结果进行排序。

我想做:

def query = """ 
  select user from 
   (select v.user, v.dateCreated from Vote as v where v.item=:item order by v.dateCreated desc) as myvotes, 
   (select c.user, c.dateCreated from Comment as c where c.item=:item order by c.dateCreated desc) as mycomments

def item = // some item
tmpUsers = Message.executeQuery (query, [item: item])  

如何合并两个查询?

最佳答案

def index() {
        def query1 = """ 
                    select new Map(v.user as user, v.dtCreated as dtCreated) from Vote as v where v.item = :item
                    """
        def query2 = """ 
                    select new Map(c.user as user, c.dtCreated as dtCreated) from Comment as c where c.item = :item
                    """                 

        def result1 = Vote.executeQuery(query1, [item: 'A'])
        def result2 = Comment.executeQuery(query2, [item: 'A'])

        def mergedList = ([] << result1 << result2)?.flatten()?.sort{a,b -> b.dtCreated <=> a.dtCreated}
        render mergedList as grails.converters.JSON
    }

我同意 HQL 中没有适当的 UNION。如果 Vote 无法连接到 Comment,则上述实现(2 个简单查询而不是 1 个复杂查询)将提供预期的结果。

假设,

class Vote {
    String item
    Date dtCreated
    String user
}

class Comment {
    String item
    Date dtCreated
    String user
}

//Bootstrap
def vote1 = new Vote(item: "A", dtCreated: new Date(), user: 'user1')
def vote2 = new Vote(item: "A", dtCreated: new Date() + 1, user: 'user2')
def vote3 = new Vote(item: "A", dtCreated: new Date() + 2, user: 'user3')

def comment1 = new Comment(item: "A", dtCreated: new Date(), user: 'user4')
def comment2 = new Comment(item: "A", dtCreated: new Date() - 4, user: 'user5')
def comment3 = new Comment(item: "A", dtCreated: new Date() - 6, user: 'user6')

[vote1, vote2, vote3, comment1, comment2, comment3]*.save(flush: true, failOnError: true)

//Output Json:
[
    {
        "dtCreated": "2013-06-23T13:49:24Z",
        "user": "user3"
    },
    {
        "dtCreated": "2013-06-22T13:49:24Z",
        "user": "user2"
    },
    {
        "dtCreated": "2013-06-21T13:49:24Z",
        "user": "user4"
    },
    {
        "dtCreated": "2013-06-21T13:49:24Z",
        "user": "user1"
    },
    {
        "dtCreated": "2013-06-17T13:49:24Z",
        "user": "user5"
    },
    {
        "dtCreated": "2013-06-15T13:49:24Z",
        "user": "user6"
    }
]

关于java - 如何合并两个 Hibernate 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226272/

相关文章:

java - 使用 IPv4 的套接字通信

java - 为什么 Hibernate 不将我的类映射为一对多关系?

java - 如何在 Hibernate Criteria 中添加 Distinct

java - 使用 @ElementCollection : org. hibernate.MappingException : Could not determine type for: java. util.Set 时出错,在表中:对于列

grails - 自定义 g :paginate to Prepend "Page x of y"

html - 新Grails 2.3.7应用程序忽略了<%=%>

Grails 3/GORM 从结果中剔除单个记录

java - 如何从netbeans向数据库插入数据?

java - 更改 Autowired bean 类型会意外更改值吗?

java - 安排 Activity 日历的最佳 Swing 解决方案