我加入了两个表并从两个表中获取不同的列以将它们加载到dataTable中。我想使用dataTable对列进行排序,但是如何理解哪些列对哪些表进行了操作?我的意思是,当我从datatable单击 last_name列上的订单按钮时,如何编写order by table1_.last_name desc
,因为表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")
来区分表格,但这不是一般方法。我不能将此方法用于其他表,因为它们可能使用不同的列,因此我必须一次又一次地将columnName更改为不同的表。
我要问的是, iRoot 和 bJoin 之类的方法是contains
来检查表是否包含< / strong> columnName ?
答案 0 :(得分:1)
在Criteria API中,您应该考虑实体及其属性,而不是表和列。
所以,假设您想要(例如)UserDTO.lastName
订购,这可能就是这样:
cq.orderBy(iRoot.get("lastName"));
我要问的是,有没有像iRoot和bJoin一样的方法检查表是否包含该columnName?
Root
有一个方法getModel
,它返回一个EntityType
,提供有关该实体的元数据。您可以在那里检查属性等。不完全是列名,但是关闭。
答案 1 :(得分:0)
我通过尝试抓住:
解决了我的问题 try {
bJoin.<String>get(sort.split(":")[0]).as(String.class);
//Use bJoin table to order
}catch(Exception e) {
//Use iRoot table to order
}
通过实施尝试捕获,我的目标是通过一种通用的方式来区分彼此。