你还在定义不同的Model/Entity作为参数和返回值?(看完这篇教你一个类公用)

此篇只是作为一个小知识点分享,每周六/周日的文章还是会依旧的,可以关注我的微信公众号:xiaobei109208,每周一篇技术分享哦。

→手里的项目终于可以稍微缓一缓啦,感觉在家办公比在公司还要忙。 

进入主题


        在日常开发中,很多同学可能都会有这种问题,编写了一个新增/修改的接口,定一个实体类(Model/Entry.java),但是在作为参数的时候,有些字段不需要前端提供又或者说再返回的时候有些系统字段并不想展示给前端。那很多同学的做法,就是定义两个差不多的实体类(Model/Entry.java),可这样又有一个问题,在新增或者查询返回的时候可以因为泛型不一致而需要重新创建实例,然后set值。

       看到这里,可能有的同学又说,哪用这么麻烦,Map包一切,Map作为参数,也作为返回值,想要给啥字段我说了算。

        emnnnnn.......抛开开发规范和前端联调的难度和后期维护,那是可以的,没问题。但是如果有更好的办法,还是值得学习一下的。

        而且不止阿里开发规范禁止使用Map作为参数和返回值的硬性规定,很多公司都是这样的,至于为什么?

1、(Model/Entry.java)在数据输入编译期就会对一些数据类型进行校验,如果出错会直接提示。而map的数据类型则需要到sql层,才会进行处理判断。

2、map的参数名称如果写错,也是需要到sql层,才能判断出是不是字段写错,不利于调试等。相对而言(Model/Entry.java)会在编译期间发现错误

3、map的参数值如果多传、乱传,也是需要到sql层,才能判断出是不是字段写错,不利于调试等。相对而言(Model/Entry.java)会在编译期间发现错误

4、仅仅看方法签名,你不清楚Map中所拥有的参数个数、类型、每个参数代表的含义。后期人员去维护,例如需要加一个参数等,如果项目层次较多,就需要把每一层的代码都了解清楚才能知道传递了哪些参数。


        现在再去手写接口文档已经很少的,集成swagger前端后端都方便,还有就是使用lombok简化代码量。好了,来看代码,我定义的Model

 

        这句注解是基于swagger的,它的场景是当你有的字段,在作为新增/修改的参数时候,不想前端传这些不必要的字段,但希望返回的时候会返回,那加上这个就可以了。

 

 新增/修改

查询返回

 

        那还要一种场景新增/修改展示,返回不展示,比如password,那怎么办?

 

        你返回的查询不查那个字段不就行了嘛?(机智

 

 

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Spring Data JPA中的@SqlResultSetMapping注解来实现从多个表中获取数据,并将结果映射为一个定义对象。 例如,假设有两个表:user和address,每个user拥有一个address。我们可以创建一个定义UserAddress来存储从这两个表中获取的数据。 首先,我们需要在UserAddress上使用@Entity注解将其定义一个实体类。然后,我们可以使用@SqlResultSetMapping注解来定义如何将查询结果映射到UserAddress对象的属性中。具体代码如下: @Entity @SqlResultSetMapping( name="UserAddressMapping", classes={ @ConstructorResult( targetClass=UserAddress.class, columns={ @ColumnResult(name="id", type=Long.class), @ColumnResult(name="name", type=String.class), @ColumnResult(name="address", type=String.class) } ) } ) public class UserAddress { private Long id; // user.id private String name; // user.name private String address; // address.address public UserAddress(Long id, String name, String address) { this.id = id; this.name = name; this.address = address; } // getters and setters } 在上面的代码中,@SqlResultSetMapping的name参数指定了映射的名称,classes参数中使用了@ConstructorResult注解,指定了UserAddress中的构造函数和需要映射的属性。在其中的columns参数中,我们需要指定需要映射的列名和型。 接下来,我们需要编写一个定义查询方法,并且在该方法上使用@NamedNativeQuery注解来指定自定义SQL语句。具体代码如下: @Repository public interface UserAddressRepository extends JpaRepository<User, Long> { @Query(nativeQuery = true) @NamedNativeQuery( name = "UserAddress.findUserAddress", query = "SELECT user.id, user.name, address.address " + "FROM user " + "INNER JOIN address ON user.address_id = address.id " + "WHERE user.id = ?1", resultSetMapping = "UserAddressMapping" ) UserAddress findUserAddress(Long id); } 在上面的代码中,我们使用@Query注解来指定自定义SQL语句,使用@NamedNativeQuery注解来给该查询方法命名,并且在其中使用resultSetMapping参数来指定要使用的结果集映射名称。 最后,我们可以在应用程序中调用findUserAddress方法来获取来自两个表的数据,代码如下: @RestController public class UserController { @Autowired private UserAddressRepository userAddressRepository; @GetMapping("/user/{id}/address") public UserAddress getUserAddress(@PathVariable Long id) { return userAddressRepository.findUserAddress(id); } } 在上面的代码中,我们使用Spring MVC创建一个RESTful API,通过调用getUserAddress方法来获取来自两个表的数据。 这样,我们就可以通过使用@SqlResultSetMapping注解和自定义SQL语句来实现从多个表中获取数据,并将结果映射为一个定义对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值