【问题标题】:How to use enum in @Query as a constant如何在@Query 中使用枚举作为常量
【发布时间】:2018-05-25 20:25:58
【问题描述】:

我试图在!= 之后放置一个完整的类路径(com.xxxx.State.Finish),但没有帮助。

@Query("select c from CustomOrder c where c.dealer = :roleName and 
     c.nextManager = null and c.currentState != Finish")
List<CustomOrder> findOpenOrder(@Param("roleName") String roleName);

实体:

@Getter
@Enumerated(EnumType.STRING)
CustomOrderEnums.State currentState;

枚举:

public enum State {
    Open, Finish
}

【问题讨论】:

  • 你有什么异常吗?
  • ... and c.currentState = com.xxxx.CustomOrderEnums.State.Finish 为我工作。
  • @MaciejKowalski org.hibernate.hql.internal.ast.InvalidPathException: Invalid path: 'com.xxx.CustomOrderEnums.Status.Finish',在 IDE 中我可以通过按下 @Query 打开完成定义。
  • @RobertNiestroj 我也是这么想的,但它抛出了hibernate invalid path exception
  • com.xxxx 只是一个例子。你需要把你的枚举路径放在那里。

标签: spring-data-jpa


【解决方案1】:
@Query("select c from CustomOrder c where c.dealer = :roleName and 
     c.nextManager = null and c.currentState != com.xxx.FooEnum.Finish")

FooEnum 必须是顶级而不是内部。如果必须是内部类,请使用' 带引号的字符串(没有' 未尝试过)。

@Query("select c from CustomOrder c where c.dealer = :roleName and 
     c.nextManager = null and c.currentState != 'Finish'")

我刚刚发现,不用@Query,它可以简单地用作:

List<User> findIdByRoleRoleAndProvinceType(String role, ProvinceEnum.ProvinceType provinceType);

这是实体用户:

@Entity
public class User {
    Role role; // entity has a String field role;
    Province province; // entity has a ProvinceEnum.ProvinceType field type.
...
}

【讨论】:

  • 我遇到了同样的问题,根据你的回答,将声明的枚举从它所在的类中移出并移到它自己的类中就可以了,干杯。我要注意-您使用and c.currentState != 'Finish' 给出的示例实际上只是在进行字符串比较(在数据库中)-它没有使用枚举值。如果您更改了该枚举值,则必须返回并更新查询以修复它。
  • @PhilBrock 真实
猜你喜欢
  • 2019-12-02
  • 2011-01-21
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2018-09-14
  • 2016-07-29
相关资源
最近更新 更多