我想对一些Integer字段进行排序,但开箱即用的CriteriaBuilder将我的查询命令为字符串:
示例(从小到大): 1 - 10 - 5
我怎么能解决这个问题?我可以在查询中添加比较器或其他内容吗?
代码:
CriteriaBuilder cb = em().getCriteriaBuilder();
CriteriaQuery<MessageLog> cq = cb.createQuery(MessageLog.class);
Root<MessageLog> messageLogRoot = cq.from(MessageLog.class);
cq.select(messageLogRoot);
Path<?> path = getPath(sortField, messageLogRoot);
cq.orderBy(cb.asc(path));
private Path<?> getPath(String sortField, Root<MessageLog> messageLogRoot) {
Path<?> path;
if (sortField == null) {
return messageLogRoot.<Date>get("sendDate");
}
switch (sortField) {
case "messageTypeCode":
path = messageLogRoot.<Integer>get("messageTypeCode");
break;
default:
path = messageLogRoot.<MessageLogStatus>get("messageLogStatus");
}
return path;
}
注意:对于日期和我的枚举,我遇到了同样的问题。我正在使用JPA 2.0
编辑:
MessageLog实体:
@Entity
@Table(name = "MESSAGE_LOG")
public class MessageLog extends Domain {
private static final long serialVersionUID = -2051028296593954613L;
@Column(name = "SEND_DATE")
@Temporal(TemporalType.TIMESTAMP)
@NotNull
private Date sendDate;
@Column(name = "MESSAGE_TYPE_CODE")
@NotNull
private Integer messageTypeCode;
@Column(name = "MESSAGE_LOG_STATUS")
@NotNull
@Enumerated(EnumType.STRING)
private MessageLogStatus messageLogStatus;