【问题标题】:constant enum value in HQLHQL 中的常量枚举值
【发布时间】:2014-09-26 16:01:47
【问题描述】:

我有一个有效的查询,我需要通过使用常量枚举值过滤来修改它。

现在看起来是这样的:

public static final String venueQuery = 
       "select distinct v from package.Venue v "
        + "<some joins here> "
        + "WHERE v.venueType = package.enums.VenueType.VOUCHER_PROVIDER ";

以这种方式更改数据会导致

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token

列定义是这样的:

@Enumerated(EnumType.STRING)
@Column(name = "venue_type")
private VenueType venueType;

枚举定义是这样的:

public enum VenueType {
    RESTAURANT, BAR, CAFE, FUN_CLUB, VOUCHER_PROVIDER
}

我确信查询的其他部分工作正常,因为删除它后,不会抛出异常。

在 HQL 查询中设置常量枚举值有技巧吗?

【问题讨论】:

  • 你试过参数化查询吗?并传递一个枚举值作为参数值?
  • 是的,通过就好了。但我使用venueQuery 进行基本查询,并使用额外的ORDER BY 或WHERE 原因字符串对其进行扩展。所以我想避免向所有派生方法添加参数

标签: java hibernate enums hql


【解决方案1】:

首选方法是向查询添加参数并将枚举实例作为参数值传递,但如果您不(或不能)使其成为参数化查询,您仍然可以使用String 这样的串联:

public static final String venueQuery = 
   "select distinct v from package.Venue v "
    + "<some joins here> "
    + "WHERE v.venueType = '" + VenueType.VOUCHER_PROVIDER.name() +"'";

如果你想要一个编译时间常数查询String:

public static final String venueQuery = 
   "select distinct v from package.Venue v "
    + "<some joins here> "
    + "WHERE v.venueType = 'VOUCHER_PROVIDER'";

【讨论】:

  • 该方法的 10 倍,但从该解决方案生成的字符串值将接近提供的字符串。我的主要问题是我提供的字符串不起作用,所以你的解决方案也不起作用:(
  • 我喜欢避免硬编码类和值选项的方法,但@Query 注解似乎不可能:编译器告诉我“元素不是常量字符串”
  • 那么在这种情况下,您必须将它们放在撇号中,而且很可能不能包含类名。已编辑。
  • 我需要一个 const 值,但调用 final 方法是运行时表达式 -> 编译错误
  • 谢谢。这对我有用:“WHERE v.venueType 'VOUCHER_PROVIDER'”。似乎字符串枚举必须被视为常规字符串。枚举类不能被提及!
猜你喜欢
  • 2011-07-09
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
相关资源
最近更新 更多