首先声明我不是数据库专家。这些东西把我搞糊涂了,但不幸的是我在工作中被迫这样做,所以我有点卡住了:-)
我试图通过在 JPQL 中工作来获得一个复杂的订单,但我一点运气都没有。
我当前的查询如下所示:
select distinct msg from CSMessage msg, Error err where msg = err.msg order by err.task.src
我试图用它完成的是获取所有带有相关错误的消息,然后使用源文档 (err.task.src) 对整个事情进行排序,以显示所有具有相同来源的错误消息在一起。
不用说这根本不起作用。我得到一个异常(exception)说; “ORDER BY 项目应该在 SELECT DISTINCT 列表中”
我查看了文档和其他资源,其中似乎没有任何可以帮助我的东西。
谁能指出我正确的方向?
谢谢
编辑 1:
实体看起来像这样:
CSMessage
public class CSMessage extends BaseModel implements Serializable { private static final long serialVersionUID = 1L; . . . Other fields not shown for brevity . . . @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name = "TASK_ID") private Task task; }
错误:
public class Error { private static final long serialVersionUID = 1L; @Column(name = "ERR_STRING", length = 255) private String errString; @Column(name = "ERR_TYPE") private Integer errType; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name = "MSG_ID") private CSMessage msg; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name = "SRC_ID") private CommonSource src; @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinColumn(name = "TASK_ID") private Task task; }
任务
public class Task { private static final long serialVersionUID = 1L; @Column(name = "CORRELATION_UUID", length = 36) private String correlationId; @Column(name = "CURRENT_NODE", length = 255) private String currentNodeName = "empty"; @Column(name = "PROCESS_NAME", length = 255) private String processName = "empty"; @Column(name = "SITE_ID", length = 10) private String siteId = "1"; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "SRC_ID") private CommonSource src; }
最佳答案
您有多种选择:
从 CSMessage msg 中选择不同的 msg,Error err where msg = err.msg order by err.task.src
将 err.task.src 添加到 select 子句 (select msg, err.task.src) 并更改方法中的返回类型
在内存中排序而不是 bd,使用接口(interface) Comparable(实现 Comparable 并使用 Collections.sort)
您也可以使用 criteriaQuery 或 nativeQuery
https://stackoverflow.com/questions/4148040/