@查询(value=“SELECT g.*,gm.*FROM group g LEFT JOIN group_members gm ON g.group_id=gm.group_id and gm.user_id=:userId WHERE g.group_id=:groupId”,nativeQuery=true) GroupDetails getGroupDeails(@Param(“userId”)整数用户Id,@Param(“groupId”)整型组Id);
8个答案
公共接口UserRepository扩展了JpaRepository<User,Integer>{ @查询(value=“SELECT firstname,lastname FROM SD_User WHERE id=?1”,nativeQuery=true) NameOnly findByNativeQuery(整数id); 公共静态接口NameOnly{ 字符串getFirstname(); 字符串getLastname(); } }
@查询(value=“SELECT user.firstname,user.lastname FROM SD_user user WHERE id=?1”,nativeQuery=true) NameOnly findByNativeQuery(整数id);
@查询(value=“SELECT user.firstname AS firstname,user.lastname AS lastname FROM SD_user user WHERE id=?1”,nativeQuery=true) NameOnly findByNativeQuery(整数id);
@SqlResultSet映射( name=“groupDetailsMapping”, 类={ @构造函数结果( targetClass=组详细信息.class, 列={ @ColumnResult(name=“GROUP_ID”), @ColumnResult(name=“USER_ID”) } ) } ) @NamedNativeQuery(name=“getGroupDetails”,query=“SELECT g.*,gm.*FROM group g LEFT JOIN group_members gm ON g.group_id=gm.group_id and gm.user_id=:userId WHERE g.group_id=:groupId”,resultSetMapping=“groupDetailsMapping”)
GroupDetails getGroupDeails(@Param(“userId”)整数用户Id,@Param(“groupId”)整型组Id);
-
20 为了使spring数据能够匹配NamedNativeQuery,需要将域实体的类名后跟一个点作为NamedNativeQuery名称的前缀。 因此名称应该是(假设域实体是Group)“Group.getGroupDetails”。 – 格兰特·雷 评论 2016年11月22日8:08 -
-
1 -
三 @SqlResultSet映射 和 @名称NativeQuery 注释必须出现在Spring数据存储库中使用的实体上(例如 公共接口CustomRepository扩展了CrudRepository<CustomEntity,Long> 它是 客户实体 类别) – 托马斯·W 评论 2017年11月29日14:05 -
1 不要忘记将@Query(nativeQuery=true)放在GroupDetails getGroupDeails(@Param(“userId”)上。。。 – 彼得津霍16 评论 2019年4月10日16:11
@查询(value=“SELECT g.*,gm.*FROM group g LEFT JOIN group_members gm ON g.group_id=gm.group_id and gm.user_id=:userId WHERE g.group_id=:groupId”,nativeQuery=true) 字符串[][]getGroupDetails(@Param(“userId”)整数用户Id,@Param;
-
三 -
-
9 这太冒险了。 若表中的列顺序发生了更改(例如,添加了新列,或修改了现有列),则可以混合结果值。 例如,如果您的实体 客户端ID 字段,但列已从 客户端id 到 用户id 然后,由于缺少列名验证,很难检测到这种更改。 – 马努申·伊戈尔 评论 2021年3月4日11:29 -
@manushin-igor建议的简单解决方法是在查询中按顺序登记列名,以便安全地映射它。 类似如下:@Query(value=“SELECT g.group_id,g.userId,gm.group_name FROM group g LEFT JOIN group_members gm ON g.group_id=gm.group2d and gm.user_id=:userId WHERE g.group_id=:groupId”,nativeQuery=true)String[][]getGroupDetails(@Param(“userId”)Integer userId,@Param; – 法哈德·伊斯拉 评论 2023年11月6日9:36
@查询(“SELECT NEW example.CountryAndCapital(c.name,c.capital.name)FROM Country AS c”)
包装示例; 公共阶级国家和首都{ public String countryName; public String capitalName; public CountryAndCapital(字符串countryName,字符串capitalName){ this.countryName=国家名称; this.capitalName=资本名称; } }
-
-
-
14 -
6 -
@实体 @不可变的
公众类地址{
@身份证 私有Long id;
公共接口AddressView{ 字符串getZipCode(); }
公共接口AddressRepository扩展存储库{ @查询(“EXEC SP_GETCODE?1”) 列表<AddressView>getAddressByState(字符串状态); }
私有ObjectMapper对象映射器; 公共静态列表<Map<String,Object>>convertTuplesToMap(列表<?>元组){ 列表<Map<String,Object>>result=new ArrayList(); tuples.forEach(对象->{ if(Tuple single的对象实例){ Map<String,Object>tempMap=new HashMap<>(); for(TupleElement<?>键:single.getElements()){ tempMap.put(key.getAlias(),single.get(key)); } result.add(tempMap); }其他{ throw new RuntimeException(“Query should return instance of Tuple”); } }); 返回结果; } public<T>List<T>parseResult(List<?>List,Class<T>clz){ 列表结果=新数组列表(); convertTuplesToMap(列表).forEach(map->{ result.add(objectMapper.convertValue(map,clz)); }); 返回结果; } 公共静态类CustomDTO{ 私有字符串param1; private Integer参数2; 私有偏移日期时间参数3; } 公共列表<CustomDTO>doSomeQuery(){ 查询查询=entityManager.createNativeQuery(“SELECT param1,param2 param3…”,Tuple.class); return parseResult(query.getResultList(),CustomDTO.class); }
final String sql=“SELECT g.*,gm.*FROM group g LEFT JOIN group_members gm ON g.group_id=gm.group_id and gm.user_id=?WHERE g.group_id=?”; 默认组详细信息getGroupDetails(整数userId,整数groupId){ return BaseRepository.getInstance().uniqueResult(sql,GroupDetails.class,userId,groupId); }
@持久性上下文 公共实体管理器em; public<T>T uniqueResult(字符串sql,类<T>dto,对象…参数){ Session Session=em.unwrap(Session.class); NativeQuery q=会话.createSQLQuery(sql); if(params!=空){ for(int i=0,len=params.length;i<len;i++){ 对象参数=参数[i]; q.setParameter(i+1,参数); } } q.setResultTransformer(Transformers.aliasToBean(dto)); return(T)q.uniqueResult(); }