【问题标题】:Hibernate : Using AND combined with OR in a single queryHibernate:在单个查询中使用 AND 与 OR 结合
【发布时间】:2015-06-29 12:03:50
【问题描述】:

我正在开发一个 Spring-MVC 项目,我需要使用给定的参数搜索一些信息。这是我当前的 HQL 查询,它很可能不会得到我需要的数据。 :

 org.hibernate.Query query = session.createQuery("From GroupNotes as " +
                "n where n.ownednotes.msectionid=:msectionid and n.noteDisabled=false and n.noteInActive=false order by n.mnoteorder");
        query.setParameter("msectionid", msectionid);

    Query hiddenNotesQuery = session.createQuery("from GroupNotes as gn where gn.ownednotes.msectionid=:msectionid and gn.privateNoteUser=:username");
        hiddenNotesQuery.setParameter("msectionid", msectionid);
        hiddenNotesQuery.setParameter("username",person.getUsername());

        List<GroupNotes> groupNotesList = new ArrayList<>();

        groupNotesList.addAll(query.list());
        groupNotesList.addAll(hiddenNotesQuery.list());

我想要这样的东西:

from GroupNotes as n where (n.ownednotes.msectionid=:msectionid and n.noteDisabled=false and n.noteInActive=false and n.privateNoteUser=:"") or (n.ownednotes.msectionid=:msectionid and n.privateNoteUser=:username n.noteDisabled=false and n.noteInActive=false) 

我希望我正在寻找的查询是有意义的,所以基本上它应该检索未禁用且未激活的 GroupNotes,但它也应该注意它只是检索特定用户的私有 GroupNotes,因此在第一个括号将 privateNoteUser 设为“”。我不知道我应该在那里拥有什么。

如果有任何疑问,请告诉我。我怎样才能形成这个查询。

更新:

@Override
    public List<GroupNotes> listGroupNotesBySectionId(int msectionid) {
        Person person = this.personService.getCurrentlyAuthenticatedUser();
        Session session = this.sessionFactory.getCurrentSession();
        org.hibernate.Query query = session.createQuery("From GroupNotes as " +
                "n where n.ownednotes.msectionid=:msectionid and ((n.noteDisabled=false and n.noteInActive=false and n.privateNoteUser=:blank) or (n.privateNoteUser=:username and n.noteDisabled=false and n.noteInActive=false)) order by n.mnoteorder");
        query.setParameter("msectionid", msectionid);
        query.setParameter("msectionid", msectionid);
        query.setParameter("username",person.getUsername());
        query.setParameter("blank",null);
        List<GroupNotes> groupNoteses = query.list();

}

我创建了这样的查询,但我没有返回任何数据。

【问题讨论】:

    标签: java spring hibernate postgresql spring-mvc


    【解决方案1】:
    from GroupNotes as n where n.ownednotes.msectionid=:msectionid  
    and (
     ( n.noteDisabled=false and n.noteInActive=false and n.privateNoteUser=:"") 
       or
     ( n.privateNoteUser=:username n.noteDisabled=false and n.noteInActive=false)
    ) 
    

    【讨论】:

    • 你能检查一下帖子上的编辑吗,我按照你说的做了查询,我得到的是空数据。
    • 我认为查询和语法是正确的。您是否遇到任何 Hibernate 错误?由于您可以访问列和表 - 您能否验证查询是否执行了正确的条件子句?即我们正在检查 where 子句语句中的正确字段/值。
    • 是的,如果我分解它并像我通常调用的方式那样调用它,那么它就可以工作。我可以在 PGAdmin 中看到表格中有数据。我没有收到任何休眠错误。
    • 你可以粘贴你在 pgadmin 中使用的查询吗?只是想比较一下。
    • 这是一个 HQL 查询,而不是一个 SQL 查询...如何在 PGAdmin 中获得 HQL 查询的输出。我需要翻译它……给我一些时间……但是我在 query.list 上运行了一个 for 循环并使用了 System.out,它没有进入循环本身,因为列表是空的。
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2013-01-11
    • 2011-09-08
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多