Spring获取泛型类

dav*_*ani 5 java generics spring

我知道这个问题经常被问到,但我找不到解决方案。如何在 Spring 注入的存储库中获取泛型类名?

这是我的基本存储库

public interface UserRepository extends JpaRepository<User, Long>, IUserRepository<User>{
   User findByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)

这是界面

public interface IUserRepository<T> {
   public List<T> findAllValidEtSiteAndStructure();
}
Run Code Online (Sandbox Code Playgroud)

最后是实现

public class UserRepositoryImpl<T> implements IUserRepository<T> {

@PersistenceContext
private EntityManager em;

private Class< T > type;

@Override
public List<T> findAllValidEtSiteAndStructure() {
    final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication instanceof UserAuthentication) {
        final User currentUser = ((UserAuthentication) authentication).getDetails();
        return (List<T>) em.createQuery("FROM " + type.getName()+ " WHERE site=:site AND structure=:structure AND valid=:valid")
                .setParameter("site", currentUser.getInstallation().getSite())
                .setParameter("structure", currentUser.getInstallation().getStructure())
                .setParameter("valid", true)
                .getResultList();
    }
    return null;
}
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到 type.name?提前致谢

s_b*_*ead 7

考虑到您使用的是 Spring Framework,请使用下面的代码片段,我已经测试过它运行得很好:

ResolvableType resolvableType = ResolvableType.forClass(UserRepository.class).as(JpaRepository.class);
System.out.println(resolvableType.getGeneric(0));//User
System.out.println(resolvableType.getGeneric(1));//Long
Run Code Online (Sandbox Code Playgroud)


mh-*_*dev 2

您问题的一般答案可以在文档 -> http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations中的自定义实现一章中看到Spring 数据存储库

但我认为对于你的情况来说这没有必要。您应该能够通过以下方式完成此操作。

public interface UserRepository extends JpaRepository<User, Long> {

   User findByUsername(String username);

   List<User> findByStructureAndSiteAndValid(Structure structure, Site site, boolean valid);
}
Run Code Online (Sandbox Code Playgroud)