spring data jpa @Query with enum type not returning data

10,263

You're using a native query instead of a JPQL query, which would use the mappings defined in your entity to use the appropriate types and bind the enums correctly. Replace your query with a JPQL query:

@Query("select inspector FROM Inspector inspector where inspector.state in :stateList")
Share:
10,263
Akshay
Author by

Akshay

Musician, Developer, Husband.

Updated on June 13, 2022

Comments

  • Akshay
    Akshay almost 2 years

    Here goes. Logs show no records returned.

    14:10:01.331 TRACE JdbcCoordinatorImpl - Registering statement [SELECT inspector.* FROM inspector inspector WHERE inspector.mailState IN (?, ?)] 14:10:01.331 TRACE JdbcCoordinatorImpl - Registering last query statement [SELECT inspector.* FROM inspector inspector WHERE inspector.mailState IN (?, ?)] 14:10:01.331 DEBUG Loader - bindNamedParameters() UNREAD -> stateList_0_ [1] 14:10:01.332 TRACE BasicBinder - binding parameter [1] as [VARBINARY] - [UNREAD] 14:10:01.336 TRACE SerializationHelper - Starting serialization of object [UNREAD] 14:10:01.336 DEBUG Loader - bindNamedParameters() BLOCK_FAILURE -> stateList_1_ [2] 14:10:01.337 TRACE BasicBinder - binding parameter [2] as [VARBINARY] - [BLOCK_FAILURE] 14:10:01.337 TRACE SerializationHelper - Starting serialization of object [BLOCK_FAILURE] 14:10:01.337 TRACE Loader - Bound [3] parameters total 14:10:01.338 TRACE JdbcCoordinatorImpl - Registering result set [com.mysql.jdbc.JDBC4ResultSet@41f0527f] 14:10:01.338 TRACE Loader - Processing result set 14:10:01.338 TRACE Loader - Done processing result set (0 rows) 14:10:01.338 TRACE Loader - Total objects hydrated: 0

    Table definitely has a record with 'UNREAD' in the mailState column. JpaRepository using spring data jpa has the following code

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

    My Inspector class is as such

    @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);
            }
        }
    }
    

    Why is this returning no records when I can clearly see a record and hibernate loads up the enums for the query. Any ideas?