如何检查 table 是否包含 JPA - Criteria API 中的列?
How to check if table contains column in JPA - Criteria API?
我加入了两个 table 并从两个 table 中获取不同的列以将它们加载到数据表中。我想使用 dataTable 对列进行排序,但我如何理解哪些列属于哪些 tables?我的意思是,当我点击数据 table 的 last_name 列 上的订单按钮时,我怎么写 order by table1_.last_name desc
因为有来自 [= 的列35=]2 虽然。
所以我的代码是这样的;
public Page<UserDTO> findByCriteria(String columnName, final String filters, String sort, Pageable pageable) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserDTO> cq = cb.createQuery(UserDTO.class);
Root<UserDTO> iRoot = cq.from(UserDTO.class);
Join<UserDTO, User> bJoin= iRoot.join("user");
cq.multiselect(bJoin.get("id"), bJoin.get("login"), bJoin.get("firstName"), bJoin.get("lastName"), bJoin.get("dayOfBirth"), iRoot.get("district"));
........
if (!columnName.equals("district")) {
.....
}
.......
if (sort.split(":")[0].equals("district") || columnName.equals("district")) {
.......
}
.........
}
如您所见,我使用 !columnName.equals("district")
来区分 table,但这不是通用的方法。我不能将此方法用于另一个 tables,因为它们可能使用不同的列,因此我将不得不更改 columnName 以一次又一次地区分 tables。
我想问的是,对于 iRoot 和 bJoin 是否有类似 contains
的方法来检查是否table 包含 columnName ?
在 Criteria API 中,您应该从实体及其属性的角度考虑,而不是从表和列的角度考虑。
因此,假设您想在(例如)UserDTO.lastName
上订购,这可能是这样的:
cq.orderBy(iRoot.get("lastName"));
What I'm asking is that, is there a method like contains for iRoot and bJoin to check if table contains that columnName ?
Root
有一个方法 getModel
,其中 returns 和 EntityType
提供实体的元数据。您可以在那里检查属性等。不完全是列名,但很接近。
我使用 try catch:
解决了我的问题
try {
bJoin.<String>get(sort.split(":")[0]).as(String.class);
//Use bJoin table to order
}catch(Exception e) {
//Use iRoot table to order
}
通过实施 try catch,我的目标是创建一种通用的方法来区分表。
我加入了两个 table 并从两个 table 中获取不同的列以将它们加载到数据表中。我想使用 dataTable 对列进行排序,但我如何理解哪些列属于哪些 tables?我的意思是,当我点击数据 table 的 last_name 列 上的订单按钮时,我怎么写 order by table1_.last_name desc
因为有来自 [= 的列35=]2 虽然。
所以我的代码是这样的;
public Page<UserDTO> findByCriteria(String columnName, final String filters, String sort, Pageable pageable) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserDTO> cq = cb.createQuery(UserDTO.class);
Root<UserDTO> iRoot = cq.from(UserDTO.class);
Join<UserDTO, User> bJoin= iRoot.join("user");
cq.multiselect(bJoin.get("id"), bJoin.get("login"), bJoin.get("firstName"), bJoin.get("lastName"), bJoin.get("dayOfBirth"), iRoot.get("district"));
........
if (!columnName.equals("district")) {
.....
}
.......
if (sort.split(":")[0].equals("district") || columnName.equals("district")) {
.......
}
.........
}
如您所见,我使用 !columnName.equals("district")
来区分 table,但这不是通用的方法。我不能将此方法用于另一个 tables,因为它们可能使用不同的列,因此我将不得不更改 columnName 以一次又一次地区分 tables。
我想问的是,对于 iRoot 和 bJoin 是否有类似 contains
的方法来检查是否table 包含 columnName ?
在 Criteria API 中,您应该从实体及其属性的角度考虑,而不是从表和列的角度考虑。
因此,假设您想在(例如)UserDTO.lastName
上订购,这可能是这样的:
cq.orderBy(iRoot.get("lastName"));
What I'm asking is that, is there a method like contains for iRoot and bJoin to check if table contains that columnName ?
Root
有一个方法 getModel
,其中 returns 和 EntityType
提供实体的元数据。您可以在那里检查属性等。不完全是列名,但很接近。
我使用 try catch:
解决了我的问题 try {
bJoin.<String>get(sort.split(":")[0]).as(String.class);
//Use bJoin table to order
}catch(Exception e) {
//Use iRoot table to order
}
通过实施 try catch,我的目标是创建一种通用的方法来区分表。