我在一个Question实体中有以下内容:
@NamedQuery(name = "Question.allApproved",
query = "SELECT q FROM Question q WHERE q.status = 'APPROVED'")
字符串
和
@Enumerated(EnumType.STRING)
private Status status;
// usual accessors
型
我得到了这个例外:
异常描述:编译查询时出错[Question.countApproved:SELECT COUNT(q) FROM Question q WHERE q.status = 'APPROVED'
],line 1,column 47:invalid enum equal expression,cannot compare enum value of type [myCompnay.application.Status]
with a non enum value of type [java.lang.String]
. at org.eclipse.persistence.internal.jpa. automaticManagerSetupImpl.deploy(automaticManagerSetupImpl.java:501)
我该如何解决此问题?
3条答案
按热度按时间hjzp0vay1#
我认为你应该使用你的(完全限定的)
Status
枚举而不是文字值,所以类似这样:(假设你的Status
枚举在com.myexample
包中)字符串
sg24os4d2#
您可以在@NamedQuery(或@Query)注解中使用JPQL(Java持久性查询语言),然后在查询中使用param对象的属性。
字符串
nqwrtyyt3#
自从最初的帖子发布4年以来,有了一些发展。使用spring 4和Hibernate 4,现在可以使用SpEL表达式“欺骗”Hibernate。例如:
enum:
字符串
这里有一个名为'Filter'的 Package 器类,我们将把它传递给存储库过滤方法。
型
最后,在存储库中,我们现在可以使用Filter类作为单个参数,并使查询将看起来是文字和SpEL表达式的混合体转换为Status对象:
仓库:
型
这工作得很好,但是由于一些奇怪的原因,我还没有弄清楚,如果你在Hibernate中启用SQL调试并打开绑定器日志记录,你将无法看到Hibernate将这个表达式绑定到查询变量。