【问题标题】:Hibernate nested query using criteria使用条件的休眠嵌套查询
【发布时间】:2013-06-26 12:40:06
【问题描述】:

是否可以创建生成以下sql的条件:

select name from (select distinct name from person) as aliasname  order by lower(name);

这里有两个sql——

  1. select distinct name from person

  2. select name from <output of 1> as aliasname order by lower(name)

我想创建条件然后执行criteria.list()

【问题讨论】:

    标签: java spring hibernate postgresql jpa


    【解决方案1】:

    我认为,这将满足您的需求:

    criteria.addOrder(Order.asc("name").ignoreCase())
            .setProjection(Projections.distinct(Projections.property("name")))
            .list();
    

    或者,此条件使用带有名称投影的 DetachedCriteria 作为子查询:

    DetachedCriteria distinctNamesCriteria = DetachedCriteria.forClass(Person.class);
    distinctNamesCriteria.setProjection(Projections.distinct(Projections.property("name")));
    
    criteria.add(SubQueries.propertyIn("name", distinctNamesCriteria))
            .addOrder(Order.asc("name").ignoreCase())
            .list();
    

    【讨论】:

    • 亲爱的 OGZD,在您的建议中,缺少两件事:1. 它不适用于 lower(需要使用 .ignoreCase()),2. 它不提供嵌套选择。由于此查询“按较低(姓名)从人员顺序中选择不同的姓名;”在 postgres 中失败,我正在寻找解决方法查询,如问题中所述“选择名称来自(从人员中选择不同的名称)作为别名顺序按较低(名称)”
    • 您确定生成的查询返回的结果集与问题中提到的相同吗?好吧,在您更新代码之前我已经尝试过这个并得到了不同的结果集。此条件实际上不会返回 DISTINCT 记录。如果您推荐类似的link 来回答这个问题,那就太好了
    【解决方案2】:

    我没有给你答案,但你为什么要进行第二次选择?

    SELECT DISTINCT NAME FROM PERSON AS ALIASNAME ORDER BY LOWER(NAME)
    

    将返回相同的数据。

    【讨论】:

    • 这实际上在 postgres 中给出了一个错误:错误:对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表中。所以我要进行两个选择(嵌套)
    • 您不能按select 部分中不存在的列排序。
    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 2012-09-19
    • 1970-01-01
    • 2017-04-08
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多