【问题标题】:Complex order by in JPQLJPQL 中的复杂排序依据
【发布时间】:2011-05-08 01:50:12
【问题描述】:

首先让我说我不是数据库专家。这东西简直把我弄糊涂了,但不幸的是,我在工作中被绳之以法,所以我有点卡住了:-)

我试图通过在 JPQL 工作来获得复杂的订单,但我一点运气都没有。

我当前的查询如下所示:

select distinct msg from CSMessage msg, Error err where msg = err.msg order by err.task.src

我想要完成的是获取所有带有相关错误的消息,然后使用源文档 (err.task.src) 对整个内容进行排序,以获取具有相同源的所有错误消息在一起。

不用说这根本行不通。我得到一个例外,说; "ORDER BY 项目应该在 SELECT DISTINCT 列表中"

我查看了文档和其他来源,但其中似乎没有任何可以帮助我的东西。

谁能指出我正确的方向?

谢谢

编辑 1:

实体如下所示:

CSMessage

公共类 CSMessage 扩展 BaseModel 实现 Serializable
{

    私有静态最终长序列版本UID = 1L;

        .
        .
        .
        为简洁起见未显示其他字段
        .
        .
        .
    @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "TASK_ID")
    私人任务任务;
}

错误:

公共类错误 { 私有静态最终长序列版本UID = 1L; @Column(名称 = “ERR_STRING”,长度 = 255) 私有字符串错误字符串; @Column(name = "ERR_TYPE") 私有整数错误类型; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name = "MSG_ID") 私人 CSMessage 消息; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name = "SRC_ID") 私有的 CommonSource src; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name = "TASK_ID") 私人任务任务; }

任务

公开课任务
{

    私有静态最终长序列版本UID = 1L;

    @Column(name = "CORRELATION_UUID", 长度 = 36)
    私有字符串相关 ID;

    @Column(name = "CURRENT_NODE", 长度 = 255)
    私有字符串 currentNodeName = "空";

    @Column(name = "PROCESS_NAME", 长度 = 255)
    私有字符串 processName = "空";

    @Column(name = "SITE_ID", 长度 = 10)
    私人字符串 siteId = "1";

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SRC_ID")
    私有的 CommonSource src;
}

【问题讨论】:

  • 请显示您的实体(它们之间的关联)。

标签: jpa jpql


【解决方案1】:

您有多种选择:

select distinct msg from CSMessage msg, Error err where msg = err.msg order by err.task.src

  • 将 err.task.src 添加到 select 子句(选择 msg、err.task.src)并更改方法中的返回类型

  • 在内存中排序而不是 bd,使用接口 Comparable(实现 Comparable 并使用 Collections.sort)

  • 您也可以使用 criteriaQuery 或 nativeQuery

【讨论】:

    【解决方案2】:

    如果您唯一的问题是对结果列表进行排序,那么一种方法是在全局字段上添加@OrderBy(默认顺序是 ASC,可以省略):

    @OrderBy("YOUR_COLUMN_NAME")

    如果要降序,语法为:

    @OrderBy("YOUR_COLUMN_NAME DESC")

    例如:

    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "TASK_ID")
    @OrderBy("TASK_ID") // <-------- ASC
    private Task task;
    
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SRC_ID")
    @OrderBy("SRC_ID DESC") // <-------- DESC
    private CommonSource src;
    

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 2011-06-23
      • 2010-12-30
      • 2015-03-02
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      相关资源
      最近更新 更多