gpt4 book ai didi

java - 一般搜索条件类型

转载 作者:行者123 更新时间:2023-11-29 06:41:16 26 4
gpt4 key购买 nike

我的应用程序使用表示层、服务层和数据访问层构建。有多种服务和 API 通常需要从数据访问层检索一些数据。为了获得这样的数据,我经常需要将一些搜索条件从一层传递到另一层。例如,我可以传递诸如 from_date、to_date、email_id、user_id 等属性。现在我没有传递很多单独的参数,而是尝试传递一个对象,比如 SearchCriteria。同样,不同的服务/api 需要不同的 SearchCriterias。

问题是,我如何使它通用以便所有服务都可以使用它。一种方法是使用一个 SearchCriteria 对象,该对象保存 SEARCH_KEY 到值的映射,其中 SEARCH_KEY 可以是一个枚举(具有 FROM_DATE、TO_DATE 等值)。根据 SEARCH_KEY,我可以检索 key 并使用它。但这仅在您一层知道从该映射中期望值的类型(整数,字符串)时才有效。一层耦合到另一层,我认为这不好。我经历了这个问题 - Map with multiple value types with advantages of generics这解决了类似的问题。这是一个好的设计吗?有没有更好的选择?

最佳答案

如果您使用的是 JPA 之类的东西,您可能需要查看 JPA Criteria API .这样你就可以编写一个基本的过滤器类:

public abstract class AbstractFilter<T> {
private EntityManager em;
private Class<T> entityClass;
private List<Predicate> predicates;
private CriteriaBuilder cb;

public AbstractFilter(EntityManager em, Class<T> clazz) {...}

protected void add(Predicate predicate) {
if (predicates == null) predicates = new ArrayList<>();
if (predicate != null) predicates.add(predicate);
}

protected <X> void addEqual(Expression<X> expression, X value) {
if (expression != null && value != null && cb != null)
add(cb.equal(expression, value));
}

protected abstract void buildPredicates(Root<T> root);

public List<T> getResultList() {
this.cb = em.getCriteriaBuilder();
CriteriaQuery<T> query = cb.createCriteria(entityClass);
Root<T> root = query.from(entityClass);
buildPredicates(root);
return em.createQuery(query.select(root).where(predicates)).getResultList();
}
}

public class UserFilter<User> {
private String firstName, lastName; // plus getter and setter
private Gender gender; // plus getter and setter

public UserFilter(EntityManager em) { super(em, User.class); }

protected void buildPredicates(Root<User> user) {
addEqual(user.get(User_.firstName), getFirstName());
addEqual(user.get(User_.lastName), getLastName());
addEqual(user.get(User_.gender), getGender());
}
}

------

UserFilter filter = new UserFilter(entityManager);
filter.setFirstName("Joe");
filter.setGender(Gender.Male);
List<User> users = filter.getResultList();

这只是过滤器类的一个非常基本的示例,您可以向过滤器添加越来越多的 addXXX(Expression, ?) 方法以及排序和分页等功能。请注意,如果您想将 EntityManager 与其他层分开,您应该通过 DAO 设置它,例如作为 getResultList(EntityManager) 方法中的参数。


另一种解决方案可能是这样的示例对象:

User example = new User();
example.setFirstName("J*");
example.setGender(Gender.Male);
List<User> users = userDao.find(example);

您的 DAO 实现自己进行过滤的地方。

关于java - 一般搜索条件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11771198/

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