最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

java 17 - H2 works incorrectly with nativeQuery with enum param - Stack Overflow

programmeradmin4浏览0评论

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
发布评论

评论列表(0)

  1. 暂无评论