2

我正在将 Spring Boot 应用程序迁移到 micronaut 的过程中,偶然发现了 micronaut 数据的问题。当使用在 Spring Boot 数据中工作的本机查询时,我得到一个查询的编译错误,在该查询中我尝试将一些数据插入到关联表中。

Unable to implement Repository method: MyEntityRepository.insertQueryExample(int id, String name). No possible implementations found.

其他本机查询(选择、删除)工作没有问题,生成的方法也是如此。以下是使用上述方法的 repo 的样子:

public interface MyEntityRepository extends CrudRepository<MyEntity, Integer> {

    @Query(value = "insert into my_entity_my_entity2 (id, id2)" +
            " values (:id, (select me2.id from my_entity2 os where me2.name = :name))", nativeQuery = true)
    void insertQueryExample(int id, String name);
}

my_entity_my_entity2 没有实体类,但它在春季有效,所以我认为这不是问题。

在此先感谢您的帮助。

4

1 回答 1

1

my_entity_my_entity2 没有实体类,但它在春季有效,所以我认为这不是问题。

确实,这就是问题所在。

所有人都io.micronaut.data.repository.GenericRepository需要一个相应的实体类型(必须自省,它是Micronaut Data JPA还是Micronaut Data JDBC实现。

您剩下的解决方案是实现自定义JpaRepository子类型并使用注入EntityManagerJpaRepositoryOperations执行自定义查询执行,同时保留默认拦截方法:

@Repository
public abstract class MyEntityRepository implements CrudRepository < MyEntity, Integer> {

    @Inject
    JpaRepositoryOperations operations;

    @Transactional
    void insertQueryExample(int id, String name) {
        operations.getCurrentEntityManager()
                .createNativeQuery("insert into my_entity_my_entity2 (id, id2)" +
                        " values (:id, (select os.id from my_entity2 os where os.name = :name))")
                .setParameter("id", id)
                .setParameter("name", name)
                .executeUpdate();
    }
}

然后,您可以注入您的MyEntityRepositorybean 并调用您的自定义查询方法。

于 2021-04-12T12:38:47.097 回答