gpt4 book ai didi

java - 如何在 Spring Data 自定义方法实现中使用类型参数?

转载 作者:行者123 更新时间:2023-11-29 05:39:40 25 4
gpt4 key购买 nike

根据 Spring Data Commons documentation ,将自定义方法实现添加到 Spring Data 存储库非常简单:

interface UserRepositoryCustom {
public void someCustomMethod(User user);
}

class UserRepositoryCustomImpl implements UserRepositoryCustom {
public void someCustomMethod(User user) {
// Your custom implementation
}
}

public interface UserRepository extends JpaRepository<User, Long>,
UserRepositoryCustom {
}

但是,我想不通的是,如果您想使用类型参数怎么办?例如:

interface SearchableRepository<T> {
public Page<T> search(String query, Pageable page);
}

class SearchableRepositoryImpl<T> implements SearchableRepository<T> {
public Page<T> search(String query, Pageable page) {
// Right here, I need the Class<T> of T so that I can create
// the JPA query
}
}

public interface UserRepository extends JpaRepository<User, Long>,
SearchableRepository<User> {
}

public interface NewsRepository extends JpaRepository<Article, Long>,
SearchableRepository<Article> {
}

在那个 search 的实现中方法,我需要知道 Class<T>提供的类型参数 T这样我就可以创建 JPA 查询。我不想add custom behavior to all repositories ,因为我不希望所有存储库都可搜索。我只想申请 SearchableRepository选择存储库的界面。

那么你怎么能做到这一点?或者你能做到吗?

最佳答案

Bellabax 的回答是正确的,让我走上了正确的道路,所以他得到了正确答案的荣誉和荣誉。但是对于那些遇到这个问题的人来说,这里有一个更完整的实现,它可以自动发现域类型并且不需要调用 new 任何东西,希望对某人有所帮助。

SearchableRepository.java

public interface SearchableRepository<T> {
public Page<T> search(String query, Pageable page);
}

AbstractDomainClassAwareRepository.java

class AbstractDomainClassAwareRepository<T> {
protected final Class<T> domainClass;

@SuppressWarnings("unchecked")
protected AbstractDomainClassAwareRepository() {
Type genericSuperclass = this.getClass().getGenericSuperclass();
while(!(genericSuperclass instanceof ParameterizedType))
{
if(!(genericSuperclass instanceof Class))
throw new IllegalStateException("Unable to determine type " +
"arguments because generic superclass neither " +
"parameterized type nor class.");
if(genericSuperclass == AbstractDomainClassAwareRepository.class)
throw new IllegalStateException("Unable to determine type " +
"arguments because no parameterized generic superclass " +
"found.");

genericSuperclass = ((Class)genericSuperclass).getGenericSuperclass();
}

ParameterizedType type = (ParameterizedType)genericSuperclass;
Type[] arguments = type.getActualTypeArguments();
this.domainClass = (Class<T>)arguments[0];
}
}

AbstractSearchableJpaRepository.java

class AbstractSearchableJpaRepository<T>
extends AbstractDomainClassAwareRepository<T>
implements SearchableRepository<T> {
@PersistenceContext protected EntityManager entityManager;

@Override
public Page<T> search(String query, Pageable page) {
// use this.domainClass to reference domain class
}
}

用户库.java

public interface UserRepository extends JpaRepository<User, Long>,
SearchableRepository<User> { }

UserRepositoryImpl.java

public class UserRepositoryImpl extends AbstractSearchableJpaRepository<User> { }

新闻库.java

public interface NewsRepository extends JpaRepository<Article, Long>,
SearchableRepository<Article> { }

NewsRepositoryImpl.java

public class NewsRepositoryImpl extends AbstractSearchableJpaRepository<Article> { }

关于java - 如何在 Spring Data 自定义方法实现中使用类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com