如何在@Query 中使用枚举作为常量

Tii*_*ina 5 spring-data-jpa

我试图在!=但没有帮助之后放置一个完整的类路径(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);
Run Code Online (Sandbox Code Playgroud)

实体:

@Getter
@Enumerated(EnumType.STRING)
CustomOrderEnums.State currentState;
Run Code Online (Sandbox Code Playgroud)

枚举:

public enum State {
    Open, Finish
}
Run Code Online (Sandbox Code Playgroud)

Tii*_*ina 6

@Query("select c from CustomOrder c where c.dealer = :roleName and 
     c.nextManager = null and c.currentState != com.xxx.FooEnum.Finish")
Run Code Online (Sandbox Code Playgroud)

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

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

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

List<User> findIdByRoleRoleAndProvinceType(String role, ProvinceEnum.ProvinceType provinceType);
Run Code Online (Sandbox Code Playgroud)

这是实体用户:

@Entity
public class User {
    Role role; // entity has a String field role;
    Province province; // entity has a ProvinceEnum.ProvinceType field type.
...
}
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了同样的问题,根据您的回答,将声明的枚举从它所在的类中移出并移入它自己的类中就可以了,欢呼。我要注意的是 - 您给出的“and c.currentState != 'Finish'”示例实际上只是进行字符串比较(在数据库中) - 它没有使用枚举值。如果您更改了该枚举值,则必须返回并更新查询来修复它。 (2认同)