为Ebeans查询添加orderBy后失效,请求排查语法问题
解决Ebeans查询添加
orderBy后失效的问题 看起来你遇到的问题大概率是混淆了实体类属性名和数据库列名导致的,Ebeans的查询构建器默认是基于实体类的属性来构建查询,而不是直接使用数据库表的列名。
核心问题分析
你的user_offer表有updated_at字段,但对应的UserOffer实体类中,这个字段的属性名应该是类似updatedAt(驼峰命名),并且通过@Column(name = "updated_at")注解映射到数据库列。如果直接在orderBy中写updated_at,Ebeans会尝试在实体类中找名为updated_at的属性,找不到就会导致查询失败。
解决方案
方案1:使用实体类属性名排序
把orderBy("updated_at")改成实体类对应的属性名(比如updatedAt):
List<UserOffer> userOffers = Ebean.find(UserOffer.class) .fetch("offer") .where() .eq("user_id", userId) .eq("status_id", offerViewedStatus) .orderBy("updatedAt") // 这里用实体类的驼峰属性名 .findList();
方案2:使用类型安全的查询(推荐)
为了避免拼写错误,建议使用Ebeans的类型安全查询方式,通过生成的元模型类来指定排序字段:
List<UserOffer> userOffers = Ebean.find(UserOffer.class) .fetch("offer") .where() .eq(UserOffer_.userId, userId) .eq(UserOffer_.statusId, offerViewedStatus) .orderBy(UserOffer_.updatedAt.asc()) // 升序,desc()表示降序 .findList();
(注:元模型类UserOffer_需要开启Ebeans的元模型生成功能,一般在编译时自动生成)
方案3:直接使用数据库列名(不推荐)
如果你一定要用数据库列名,可以通过raw()方法来指定原生排序语句:
List<UserOffer> userOffers = Ebean.find(UserOffer.class) .fetch("offer") .where() .eq("user_id", userId) .eq("status_id", offerViewedStatus) .orderBy().raw("updated_at") .findList();
额外排查步骤
- 查看Ebeans生成的SQL日志:开启SQL日志输出,检查生成的排序语句是否正确,比如是否出现了
column "updated_at" does not exist这类错误。 - 确认实体类映射:检查
UserOffer类中updatedAt属性的@Column注解是否正确指向数据库的updated_at字段。
内容的提问来源于stack exchange,提问作者Steven Matthews
相关产品推荐
相关产品推荐

