[英]Creating dynamic query using jpa criteria
我使用jpa條件創建了動態查詢,但是當我執行userGroupSubquery.select(userGroupsRoot);時,要在要選擇的列上添加一對額外的括號。
產生的查詢
從gm.security_groupings securitygr3_中選擇(securitygr3_.group_name,securitygr3_.user_name)其中1 = 1和securitygr3_.user_name ='xxx'和(('XYZ')中的securitygr3_.group_name)
預期查詢:
從gm.security_groupings securitygr3_中選擇securitygr3_.group_name,securitygr3_.user_name,其中1 = 1,securitygr3_.user_name ='xxx'和(('XYZ')中的securitygr3_.group_name)。
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),但不知道為什么。 請幫忙
我得到了上述解決方案。 當實體具有復合密鑰時,則使用JPA標准,而不是
userGroupSubquery.select(userGroupsRoot);
我們應該做
userGroupSubquery.select(userGroupsRoot.get("id"));
其中id是復合ID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.