首先让我说我不是数据库人。这个东西让我感到困惑,但不幸的是我在工作中遇到了这个问题,所以我有点卡住: - )
我试图通过使用JPQL来获得复杂的订单,而我根本没有运气。
我当前的查询如下所示:
select distinct msg from CSMessage msg, Error err where msg = err.msg order by err.task.src
我想要完成的是获取所有msgs的相关错误,然后使用源文档(err.task.src)对整个事物进行排序,以获取具有相同源的所有错误消息在一起。
毋庸置疑,这根本不起作用。我得到一个例外; “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; }
答案 0 :(得分:0)
您有几种选择:
从CSMessage msg中选择不同的msg,错误错误,其中msg = err.msg命令err.task.src
将err.task.src添加到select子句(选择msg,err.task.src)并更改方法中的返回类型
使用interface Comparable(实现Comparable并使用Collections.sort)在内存中而不是bd中进行排序
您也可以使用criteriaQuery或nativeQuery
答案 1 :(得分:0)
如果您唯一的问题是订购结果列表,那么一种方法是在全局字段上添加@OrderBy(默认顺序是ASC,可以省略):
@OrderBy(" YOUR_COLUMN_NAME&#34)
如果您想降序,语法将为:
@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;