SpringBoot JPA实践之@Query查询之接口结果集

JPA
placeholder image
admin 发布于:2020-05-01 22:07:26
阅读:loading

前面几篇文章中已经飞起来了多种场景的案例了,有个细节没有提到,@Query注解查询返回的结果集仍然必须是Entity类,但是通常情况更多的复杂查询将查询的是一个自定义对象(Dto):自定义Javabean,而JPA是支持查询返回自定义对象的,但它返回的对象类型必须是接口类型,其接口的具体实现被JPA代理实现(本站有类似的代理接口实现类的实现),匹配规则接口中的函数名称 = get + 数据库字段名即可,如果某个字段需要二次加工,则使用JDK8中接口的默认方法解决。

代码实现

Repository

/**
 *
查询返回接口类型
 
*
 * @author chendd
 * @date 2020/5/2 20:44
 */
public interface UserQueryInterfaceResultRepository extends BaseRepository<User, String> {

   
@Query(value = "select name , email , concat(concat(name , '_'),email) as remark " +
           
"from user where name = ?" , nativeQuery = true)
    List<UserDto> queryUsersByName(String name);

}

Test

/**
 *
测试查询返回自定义接口类型
 
*
 * @author chendd
 * @date 2020/5/2 20:50
 */
public class UserQueryInterfaceResultTest extends ApplicationTest {

   
@Resource
   
private UserQueryInterfaceResultRepository repository;

   
@Test
   
public void testQueryInterfaceResult() {

        List<UserDto> dataList =
repository.queryUsersByName("chendd");
       
for (UserDto user : dataList) {
            String remark = user.getRemark();
            String defaultRemark = user.getDefaultRemark();
            Assert.assertEquals(remark , defaultRemark);
        }
    }

}

UserDTO

该数据对象为interface类型,不是普通的class定义。

特别说明

(1)结果集interface无法定义geter/seter等方法,若存在需要二次处理的参数值,则需要配合使用jdk8的default函数的方式实现;

(2)该interface中的方法声明等于“get” + 查询字段的名称;


 点赞


 发表评论

当前回复:作者

 评论列表


留言区