I have an entity with enum field. When I use native query with param of enum type it works incorrectly. I use spring-boot-starter-parent 3.4.2
. I try to write the native sql query with parameter of enum type. And repository doesn't recognise it correctly. It works fine when I use spring data like findByStatus
but it doesn't work for native queries.
What is wrong? Any ideas?
Entity
@Data
@Entity
@Table(name = "order_")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Enumerated(EnumType.STRING)
@Column(name="status", nullable = false)
private OrderStatus status;
}
Enum
public enum OrderStatus {
ACTIVE,
FEEDBACK,
COMPLETED,
FINISHED
}
Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
@Query(nativeQuery = true, value = "SELECT * FROM order_ s WHERE s.status = :status")
List<Order> findByStatusSql(OrderStatus status);
List<Order> findByStatus(OrderStatus status);
}
Test
@DataJpaTest
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
public class OrderRepositoryTest {
@Autowired
private OrderRepository repository;
@Autowired
TestEntityManager entityManager;
@Test
void test() {
Order order = new Order(null, OrderStatus.FEEDBACK);
entityManager.persist(order);
List<Order> orders = repository.findByStatusSql(OrderStatus.FEEDBACK);
// 0
System.out.println(orders.size());
orders = repository.findByStatusSql(OrderStatus.FINISHED);
// 1
System.out.println(orders.size());
orders = repository.findByStatus(OrderStatus.FEEDBACK);
// 1
System.out.println(orders.size());
orders = repository.findByStatusSql(OrderStatus.ACTIVE);
// .springframework.dao.DataIntegrityViolationException: JDBC exception executing SQL [SELECT * FROM order_ s WHERE s.status = ?] [Value not permitted for column "('ACTIVE', 'COMPLETED', 'FEEDBACK', 'FINISHED')": "0"; SQL statement:
//SELECT * FROM order_ s WHERE s.status = ? [22030-232]] [n/a]; SQL [n/a]
}
}
Spring settings
spring:
datasource:
url: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MySQL;NON_KEYWORDS=USER
username: sa
password: sa
driver-class-name: .h2.Driver
connection-test-query: SELECT 1
jpa:
properties.hibernate.dialect: .hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop
show-sql: true