当我使用hibernate的条件进行查询时,遇到了一个问题。生成的SQL非常简单:
/* criteria query */
select
count(*) as y0_
from
cx_vss_video this_
where
this_.uploader_id=?
order by
this_.created_time asc它抱怨这一错误:
Caused by: org.postgresql.util.PSQLException: ERROR: column "this_.created_time" must appear in the GROUP BY clause or be used in an aggregate function
Position: 105
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157)存在一个相似的here问题。但它的答案似乎非常复杂,也不合理。还有别的解决办法吗?
我的实体类:
@Entity
@Table(name = "cx_vss_video")
public class Video {
public enum TranscodingStatus {
NOT_START, TRANSCODING, SUCCESS, ERROR, CANCELED;
}
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cx_vss_video_seq")
@SequenceGenerator(name = "cx_vss_video_seq", sequenceName = "cx_vss_video_seq")
private Long id;
@Column(name = "uploader_name", nullable = false)
private String uploaderName;
@Column(name = "file_name")
@NaturalId
private String fileName;
@Column(name = "created_time")
private Date createdTime = new Date();
@Column(name = "transcoding_status")
@Enumerated(EnumType.STRING)
private TranscodingStatus transcodingStatus = TranscodingStatus.TRANSCODING;
}我可以按file_name标准下订单,但如果由created_time订购的话就没有运气了。我搞不懂这个问题是从哪里来的?当我使用H2时,也会出现这个问题。
编辑--我最终通过删除order参数来解决这个问题,它现在起作用了。
CriteriaImpl criteriaImpl = criteria instanceof CriteriaImpl ? (CriteriaImpl) criteria : null;
if (criteriaImpl != null) {
Iterator<OrderEntry> it = criteriaImpl.iterateOrderings();
while (it.hasNext()) {
it.next();
it.remove();
}
criteria.setProjection(Projections.rowCount());
totalResults = (long) criteria.uniqueResult();
}发布于 2016-10-25 10:45:08
在查询上需要一个聚合函数。所以,应该是这样的:
select count(*) as y0_
from cx_vss_video this_
where this_.uploader_id = ?
group by ??
order by max(this_.created_time) asc;也就是说,您需要一个group by并修复order by。
为什么?您的原始查询--没有group by --是一个返回一行的聚合查询。用一行排序结果集是没有意义的。因此,我假设您想要按某物进行聚合,因此产生了??。然后,可以通过聚合列或聚合函数进行排序。
https://stackoverflow.com/questions/40237901
复制相似问题