spring data jpa @Query 枚举类型不返回数据

Posted

技术标签:

【中文标题】spring data jpa @Query 枚举类型不返回数据【英文标题】:spring data jpa @Query with enum type not returning data 【发布时间】:2014-02-26 12:35:53 【问题描述】:

来了。日志显示没有返回任何记录。

14:10:01.331 TRACE JdbcCoordinatorImpl - 注册语句 [SELECT inspector.* FROM inspector inspector WHERE inspector.mailState IN (?, ?)] 14:10:01.331 TRACE JdbcCoordinatorImpl - 注册最后一个查询语句 [SELECT inspector.* FROM inspector inspector WHERE inspector.mailState IN (?, ?)] 14:10:01.331 调试加载程序-bindNamedParameters() 未读-> stateList_0_ [1] 14:10:01.332 TRACE BasicBinder - 绑定参数 [1] 作为 [VARBINARY] - [未读] 14:10:01.336 TRACE SerializationHelper - 开始序列化对象 [未读] 14:10:01.336 调试加载器 - bindNamedParameters() BLOCK_FAILURE -> stateList_1_ [2] 14:10:01.337 TRACE BasicBinder - 绑定参数 [2] 作为 [VARBINARY] - [BLOCK_FAILURE] 14:10:01.337 TRACE SerializationHelper - 开始序列化对象 [BLOCK_FAILURE] 14:10:01.337 TRACE 加载程序 - 绑定 [3] 参数总计 14:10:01.338 TRACE JdbcCoordinatorImpl - 注册结果集 [com.mysql.jdbc.JDBC4ResultSet@41f0527f] 14:10:01.338 TRACE Loader - 处理结果集 14:10:01.338 TRACE Loader - 完成处理结果集(0 行) 14:10:01.338 TRACE Loader - 水合物体总数:0

表的mailState 列中肯定有一条记录为'UNREAD'。使用spring data jpa的JpaRepository有如下代码

@Query(value = "SELECT inspector.* FROM inspector inspector WHERE inspector.mailState IN :stateList", nativeQuery = true)
List<Inspector> findAllByState(@Param("stateList") List<MailState> stateList);

我的 Inspector 类就是这样

@Entity
@Table(name = "inspector")
public class Inspector 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Enumerated(EnumType.STRING)
    @Column(name = "mailState")
    private MailState state;

    //...getters and setters etc...

    public enum MailState 
        UNREAD("Unread"),
        BLOCK_SUCCESS("Block Success"),
        BLOCK_FAILURE("Block Failure");

        private final String value;

        MailState(String v) 
            value = v;
        

        public String value() 
            return value;
        

        public static MailState fromValue(String v) 
            for (MailState c: MailState.values()) 
                if (c.value.equals(v)) 
                    return c;
                
            
            throw new IllegalArgumentException(v);
        
    

当我可以清楚地看到一条记录并且休眠加载查询的枚举时,为什么这不返回任何记录。有什么想法吗?

【问题讨论】:

【参考方案1】:

您使用的是本机查询而不是 JPQL 查询,这将使用您的实体中定义的映射来使用适当的类型并正确绑定枚举。用 JPQL 查询替换您的查询:

@Query("select inspector FROM Inspector inspector where inspector.state in :stateList")

【讨论】:

没有 100% 工作,但你走在正确的轨道上。我只需要在您提供的 JPQL 查询中引用对象字段(状态)而不是数据库字段(邮件状态)。谢谢。您编辑后,我会立即标记为已接受。

以上是关于spring data jpa @Query 枚举类型不返回数据的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA native query 分页

spring data jpa @query的用法

@Query注解的用法(Spring Data JPA)

@Query注解的用法(Spring Data JPA)

spring-data-jpa 的@Query注解的使用

Spring data jpa使用枚举