如何检查 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。

我想问的是,对于 iRootbJoin 是否有类似 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,我的目标是创建一种通用的方法来区分表。