【发布时间】:2021-05-12 21:42:06
【问题描述】:
我有如下界面:
public interface SnapshotRepository extends JpaRepository<Snapshot, Integer>, ISnapshotRepositoryExtra { }
如您所见,扩展:
public interface ISnapshotRepositoryExtra {
Optional<Snapshot> latest();
}
...我在以下类中实现了 latest() 方法:
@Transactional
public class SnapshotRepositoryExtra implements ISnapshotRepositoryExtra {
@PersistenceContext
private EntityManager entityManager;
@Override
public Optional<Snapshot> latest() {
return (Optional<Snapshot>) entityManager
.createQuery("SELECT r FROM snapshot r order by timestamp DESC LIMIT 1")
.getResultStream().findFirst();
}
}
但是当我启动项目时,我看到:
java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.Optional com...persistance.snapshot.ISnapshotRepositoryExtra.latest()! No property latest found for type Snapshot!
所以我的问题是,为什么 Spring 看不到我刚刚创建的 SnapshotRepositoryExtra 类?
【问题讨论】:
-
因为 Spring 尝试自己实现接口。为什么不使用
@NativeQuery的接口方法? -
@Turing85 有没有办法告诉 Spring 将该类作为实现? (顺便说一句,是有可选的,但这只是我可以使用
@Query的情况,但还有其他我不能使用的情况) -
我不知道。 Spring 尝试通过评估
@(Native)Query-annotations 或SpEL-conventitons 自行在JpaRepository中实现该方法。 --- 据我所知,Spring Data JAP 支持Optional。 -
我不希望
@Transactional出现在存储库界面上。相反,它应该继续服务类。 -
@K.Nicholas 我建议不要用
@Transactional注释整个服务类。更好的解决方案是仅注释实际需要事务语义的方法,并正确配置事务(例如,通过设置readOnly = true如果适用)。
标签: java spring hibernate jpa transactions