【问题标题】:Creating dynamic query using jpa criteria使用 jpa 条件创建动态查询
【发布时间】:2019-07-26 01:32:55
【问题描述】:

我使用 jpa 条件创建了动态查询,但是当我执行 userGroupSubquery.select(userGroupsRoot); 时,一对额外的括号被添加到要选择的列中;

生成的查询

select (securitygr3_.group_name, securitygr3_.user_name) from gm.security_groupings securitygr3_ where 1=1 and securitygr3_.user_name='xxx' and (securitygr3_.group_name in ('XYZ'))

预期查询:

select securitygr3_.group_name, securitygr3_.user_name from gm.security_groupings securitygr3_ where 1=1 and securitygr3_.user_name='xxx' and (securitygr3_.group_name in ('XYZ'))

Subquery<SecurityGroupings> userGroupSubquery = secUsersQuery.subquery(SecurityGroupings.class);
            Root<SecurityGroupings> userGroupsRoot = userGroupSubquery.from(SecurityGroupings.class);
            Path<SecurityGroupingsId> secGroupId = userGroupsRoot.get("id");
            Path<SecurityUsers> secUsers = secGroupId.get("securityUsers_1");
            Path<SecurityUsers> securityUsers = secGroupId.get("securityUsers");
            Path<String> su_name = secUsers.get("name");
            Path<String> name = securityUsers.get("name");
            userGroupSubquery.select(userGroupsRoot);
            userGroupSubquery.getCompoundSelectionItems();



//userGroupSubquery.where(criteriaBuilder.equal(pet.get(SecurityGroupingsId_.id), root.<String>get("name")));
            Predicate restrictions3 = criteriaBuilder.conjunction();
            restrictions3 = criteriaBuilder.and(restrictions3, criteriaBuilder.and(criteriaBuilder.equal(su_name, dto.getUserId().trim().toUpperCase())));
            restrictions3 = criteriaBuilder.and(restrictions3, criteriaBuilder.and(name.in(userGroups)));
            userGroupSubquery.where(restrictions3);
            restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.exists(userGroupSubquery));
        }
        secUsersQuery.where(restrictions);

只是我在 select (securitygr3_.group_name, securitygr3_.user_name) 处得到了一对额外的括号 这给了我 ora-00907 缺少右括号错误。我确定它来自 userGroupSubquery.select(userGroupsRoot) 但我不知道为什么。请帮忙

【问题讨论】:

    标签: java sql hibernate jpa criteria-api


    【解决方案1】:

    我得到了上述问题的解决方案。当实体有复合键时,则在 JPA 标准中而不是这样做

    userGroupSubquery.select(userGroupsRoot);
    

    我们应该这样做

    userGroupSubquery.select(userGroupsRoot.get("id"));
    

    其中 id 是复合 id。

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 2015-10-22
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2021-01-19
      • 2012-02-04
      相关资源
      最近更新 更多