diff --git a/src/main/java/com/guwan/backend/builder/JoinBuilder.java b/src/main/java/com/guwan/backend/builder/JoinBuilder.java index f122d0e..b8f35c2 100644 --- a/src/main/java/com/guwan/backend/builder/JoinBuilder.java +++ b/src/main/java/com/guwan/backend/builder/JoinBuilder.java @@ -15,7 +15,6 @@ public class JoinBuilder { private final Class rootClass; private final Map, JoinInfo> joins = new HashMap<>(); private final Map, List> conditions = new HashMap<>(); - private Map, String[]> selectedFields; private Map namedSelections = new LinkedHashMap<>(); private JoinBuilder(Class rootClass) { @@ -28,51 +27,75 @@ public class JoinBuilder { /** * 添加连接表 - * @param joinClass 要连接的表实体类 + * + * @param joinClass 要连接的表实体类 * @param sourceField 主表的外键字段 * @param targetField 连接表的目标字段 */ - public JoinBuilder join(Class joinClass, String sourceField, String targetField) { + public void join(Class joinClass, String sourceField, String targetField) { joins.put(joinClass, new JoinInfo(sourceField, targetField)); - return this; } - /** * 添加等值条件 + * * @param entityClass 实体类 - * @param fieldName 字段名 - * @param value 字段值 + * @param fieldName 字段名 + * @param value 字段值 */ - public JoinBuilder equal(Class entityClass, String fieldName, V value) { + public void equal(Class entityClass, String fieldName, V value) { if (!conditions.containsKey(entityClass)) { conditions.put(entityClass, new ArrayList<>()); } conditions.get(entityClass).add(new Condition(fieldName, value, Operator.EQUAL)); - return this; } /** * 添加一个具有别名的字段选择(字符串版本) - * @param alias 字段别名 + * + * @param alias 字段别名 * @param entityClass 实体类 - * @param fieldName 字段名称 + * @param fieldName 字段名称 */ - public JoinBuilder selectAs(String alias, Class entityClass, String fieldName) { - // 存储字段信息,稍后在configureSelections处理 - if (selectedFields == null) { - selectedFields = new HashMap<>(); - } - if (!selectedFields.containsKey(entityClass)) { - selectedFields.put(entityClass, new String[0]); - } + public void selectAs(String alias, Class entityClass, String fieldName) { + namedSelections.put(alias, new SelectionInfo(entityClass, fieldName)); - - return this; + } + /** + * 执行查询并返回结果 + * @param entityManager EntityManager实例 + * @return 查询结果列表 + */ + public List execute(EntityManager entityManager) { + // 创建CriteriaBuilder + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + // 创建CriteriaQuery + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Object[].class); + + // 设置根实体 + Root root = criteriaQuery.from(rootClass); + + // 创建连接关系 + Map, From> fromMap = createJoins(root, criteriaQuery); + + // 应用所有条件,包括表之间的连接条件和额外查询条件 + List predicates = applyAllConditions(root, fromMap, criteriaBuilder); + + // 添加条件到查询 + if (!predicates.isEmpty()) { + criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))); + } + + // 设置查询结果投影 + configureSelections(root, fromMap, criteriaQuery); + + // 执行查询并返回结果 + return entityManager.createQuery(criteriaQuery).getResultList(); + } public long count(EntityManager entityManager) { CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); @@ -140,38 +163,7 @@ public class JoinBuilder { } - /** - * 执行查询并返回结果 - * @param entityManager EntityManager实例 - * @return 查询结果列表 - */ - public List execute(EntityManager entityManager) { - // 创建CriteriaBuilder - CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); - - // 创建CriteriaQuery - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Object[].class); - - // 设置根实体 - Root root = criteriaQuery.from(rootClass); - - // 创建连接关系 - Map, From> fromMap = createJoins(root, criteriaQuery); - - // 应用所有条件,包括表之间的连接条件和额外查询条件 - List predicates = applyAllConditions(root, fromMap, criteriaBuilder); - - // 添加条件到查询 - if (!predicates.isEmpty()) { - criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))); - } - - // 设置查询结果投影 - configureSelections(root, fromMap, criteriaQuery); - - // 执行查询并返回结果 - return entityManager.createQuery(criteriaQuery).getResultList(); - } + /** * 创建连接 - 修改为使用from而不是join @@ -285,32 +277,7 @@ public class JoinBuilder { return; } } - - // 如果没有命名选择或处理失败,回退到原来的处理方式 - if (selectedFields != null && !selectedFields.isEmpty()) { - List> selections = new ArrayList<>(); - - // 添加根实体的选择字段 - if (selectedFields.containsKey(rootClass)) { - for (String field : selectedFields.get(rootClass)) { - selections.add(root.get(field)); - } - } - - // 添加关联实体的选择字段 - for (Class entityClass : selectedFields.keySet()) { - if (entityClass != rootClass && fromMap.containsKey(entityClass)) { - From from = fromMap.get(entityClass); - for (String field : selectedFields.get(entityClass)) { - selections.add(from.get(field)); - } - } - } - - if (!selections.isEmpty()) { - query.multiselect(selections); - } - } + } private Predicate applyCondition(Condition condition, From from, CriteriaBuilder criteriaBuilder) { @@ -336,14 +303,14 @@ public class JoinBuilder { this.targetField = targetField; } } - + /** * 选择字段信息 */ private static class SelectionInfo { private final Class entityClass; private final String fieldName; - + SelectionInfo(Class entityClass, String fieldName) { this.entityClass = entityClass; this.fieldName = fieldName;