Java 在Spring查询注释中将枚举用作命名参数

Java 在Spring查询注释中将枚举用作命名参数,java,hibernate,spring-boot,enums,named-parameters,Java,Hibernate,Spring Boot,Enums,Named Parameters,我在spring JpaRepository中有一个查询,如下所示: @Query("SELECT COUNT(c) FROM #{#entityName} c " + "WHERE c.feature = 'BBN' OR c.feature = :feature " + "AND c.rating <= :rating " + "AND c.article.ean = c.identification.article.ean "

我在spring JpaRepository中有一个查询,如下所示:

@Query("SELECT COUNT(c) FROM #{#entityName} c "
        + "WHERE c.feature = 'BBN'  OR c.feature = :feature "
        + "AND c.rating <= :rating "
        + "AND c.article.ean = c.identification.article.ean "
        + "AND c.date BETWEEN :from AND :to "
        + "AND c.identification.type IN (:types)") 
Long countAlgorithmMatchesWithRatingAndTypeBetweenDates(
        @Param("rating") Integer rating, 
        @Param("from") Date from, 
        @Param("to") Date to, 
        @Param("feature") FeatureType feature, 
        @Param("types") IdentificationType... types);
@Enumerated(EnumType.STRING)
private FeatureType feature;
数据库中的一切看起来都很好,但Hibernates查询似乎出现了问题,原因我看不出来


我应该改为将枚举类型作为字符串传递吗?我有什么遗漏了吗?< P > > P,嗯,你必须考虑这一点:

枚举基本上是指向整数的宏。 它们是您指定名称的数字,因此您可以在代码中轻松调用它们并使其可读

要保存枚举时,请使用myEnum.getValue保存其值,该值返回调用它的枚举的int等效值,然后在数据库中将其另存为int


编辑:嗯,语法…

您的查询应该如下所示,您刚才在其中有重复的条件:


我删除了这个c.feature='BBN'

我只使用了一个枚举参数创建了一个查询。这样做可以验证值是否确实已发送,但它在输出中不可见


不要盲目信任绑定参数消息:

您的查询看起来不正确;您在“where”1中复制了条件,其中c.feature='BBN'和2与c.feature=:feature@Kh.Taheri您是对的,我尝试使用上面修改过的查询,但它仍然没有映射枚举类型。调试输出仍然不正确!你能更新它吗@塔赫里对不起,我在打电话。现在更新了@EnumeratedEnumType.STRING,我也有同样的问题,@hochas你最终找到了一个asnwerI吗?我正在转换一个旧数据库,该数据库的枚举太多,在使用序号值时无法读取。另外,注释@EnumeratedEnumType.Ordinal是否相同?这不是依赖于枚举的顺序吗?你是对的,我只是想提出这个问题,实际上我不知道这个错误是从哪里来的,可能是一个简单的语法错误?命名参数的问题不是你可以忽略它们在查询本身中的顺序吗?我只是删除了'c.feature='BBN,它同样不正确。我现在明白了。它应该在那里,但我没有注意到它应该在那里,而不是最后一个和feature=…你能在更新查询后检查日志吗!
@Enumerated(EnumType.STRING)
private FeatureType feature;
@Query("SELECT COUNT(c) FROM #{#entityName} c "
    + "WHERE c.feature = :feature "
    + "AND c.rating <= :rating "
    + "AND c.article.ean = c.identification.article.ean "
    + "AND c.date BETWEEN :from AND :to "
    + "AND c.identification.type IN (:types) ")