【问题标题】:Is it possible to convert a query with the nativeQuery flag (subquery in from clause)?是否可以使用 nativeQuery 标志(从子句中的子查询)转换查询?
【发布时间】:2020-12-22 07:31:07
【问题描述】:

下面我创建了一个查询,我需要摆脱 nativeQuery 标志。有可能吗?

@Query(nativeQuery = true, value = "" +
        " select name from (" +
        "    select distinct t.name" +
        "    from my_table t" +
        "    order by t.name asc" +
        " ) as name" +
        " where :name='' or upper(name) = upper(:name) or upper(name) like ('%' || upper(:name) || '%')" +
        " order by case when (:name='' or upper(name) like (upper(:name) || '%')) then 0 else 1 end")
Page<String> search(@Param("name") String name, Pageable pageable);

【问题讨论】:

    标签: hibernate jpa subquery hql


    【解决方案1】:

    当然,只需使用 CONCAT 函数而不是 || 连接运算符,如下所示:

    @Query("select distinct t.name" +
           "from MyEntity t" +
           "where :name='' or upper(t.name) = upper(:name) or upper(t.name) like concat(concat('%', upper(:name)), '%')" +
           " order by case when (:name='' or upper(t.name) like concat(upper(:name), '%')) then 0 else 1 end")
    Page<String> search(@Param("name") String name, Pageable pageable);
    

    【讨论】:

    • 当您插入您指定的查询时,应用程序将不会构建。 order by 后面的where 有问题。异常消息:Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: where near line 1, column 114 [select distinct t.name from MyTable t order by t.name asc where :name='' or upper(t.name) = upper(:name) or upper(t.name) like concat(concat('%', upper(:name)), '%') order by case when (:name='' or upper(t.name) like concat(upper(:name), '%')) then 0 else 1 end]
    • 写得太快了,我更新了答案中的查询。
    • 在更新的代码中,您删除了字母排序。排序结果是必要的。更新的代码仍然不起作用。错误信息:Caused by: org.postgresql.util.PSQLException: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
    • 您也将在原始查询中删除此字母顺序。您只订购内部子查询,但当您在外部查询中再次订购时,该顺序与整体结果完全无关。我不知道 PostgreSQL 中的 DISTINCT 限制。我认为在这种情况下,您必须使用 DISTINCT ONGROUP BY,但由于您拒绝了我帮助您的尝试,祝您自己找到答案。
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多