条件 Api:Order/Select 通过隐式相关 table
Criteria Api: Order/Select by implicit related table
我尝试构建一个提供以下功能的 CriteriaQuery:
我有三个表,其中包含以下字段:
table_a:
id, name_a
table_b:
id, name_b
table_ab:
id_a, id_b
现在我想从 table_a 中获取所有元素,这些元素按 table_b 中相应元素的 name_b 字段排序。
结果应该是 JpaRepository 中的使用规范。我尝试使用联接,但我一直停留在如何合并联接的问题上:
Specification<TableA> specification = (root, query, cb) -> {
CriteriaQuery<TableAb> abQuery = cb.createQuery(TableAb.class);
CriteriaQuery<TableB> bQuery = cb.createQuery(TableB.class);
Root<TableAb> abRoot = abQuery.from(TableAb.class);
Join<TableAb, TableA> aJoin = abRoot.join("tableA");
Join<TableAb, TableB> bJoin = abRoot.join("tableB");
//combine joins
query.orderBy(cb.asc(/* Expression to order by */));
return cb.conjunction();
};
在我看来,主要问题是 table_a 到 table_b 之间没有 "path",但我明确不想在 [=34= 中有任何引用] 到 table_b.
因为你使用的是 Spring Data JPA ,你可以创建一个接口,上面有一个方法,如下所示:
public interface TableABRepository extends Repository<TableAB, Long> {
public List<TableAB> findAllByOrderByTableB();
}
假设您的 TableAB class 是这样的:
class TableAB {
TableA tableA;
TableB tableB;
}
Thak 方法将 return 来自 table_ab 的所有元素按 name_b 字段排序。
之后,您只需从 TableAB returned 列表中获取 TableA 元素。
我尝试构建一个提供以下功能的 CriteriaQuery:
我有三个表,其中包含以下字段:
table_a:
id, name_a
table_b:
id, name_b
table_ab:
id_a, id_b
现在我想从 table_a 中获取所有元素,这些元素按 table_b 中相应元素的 name_b 字段排序。
结果应该是 JpaRepository 中的使用规范。我尝试使用联接,但我一直停留在如何合并联接的问题上:
Specification<TableA> specification = (root, query, cb) -> {
CriteriaQuery<TableAb> abQuery = cb.createQuery(TableAb.class);
CriteriaQuery<TableB> bQuery = cb.createQuery(TableB.class);
Root<TableAb> abRoot = abQuery.from(TableAb.class);
Join<TableAb, TableA> aJoin = abRoot.join("tableA");
Join<TableAb, TableB> bJoin = abRoot.join("tableB");
//combine joins
query.orderBy(cb.asc(/* Expression to order by */));
return cb.conjunction();
};
在我看来,主要问题是 table_a 到 table_b 之间没有 "path",但我明确不想在 [=34= 中有任何引用] 到 table_b.
因为你使用的是 Spring Data JPA ,你可以创建一个接口,上面有一个方法,如下所示:
public interface TableABRepository extends Repository<TableAB, Long> {
public List<TableAB> findAllByOrderByTableB();
}
假设您的 TableAB class 是这样的:
class TableAB {
TableA tableA;
TableB tableB;
}
Thak 方法将 return 来自 table_ab 的所有元素按 name_b 字段排序。
之后,您只需从 TableAB returned 列表中获取 TableA 元素。