如何检查表中是否包含JPA中的列 - Criteria API?

时间:2018-03-18 09:31:19

标签: java spring-data-jpa criteria-api

我加入了两个表并从两个表中获取不同的列以将它们加载到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

2 个答案:

答案 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
        }

通过实施尝试捕获,我的目标是通过一种通用的方式来区分彼此。