Spring Data JPA 写SQL语句也可以如此简单

Spring Data JPA 写SQL语句也可以如此简单在使用SpringDataJPA的时候,通常我们只需要继承JpaRepository就能获得大部分常用的增删改查的方法。有时候我们需要自定义一些查询方法,可以写自定义HQL语句像这样/***根据关注者id查找所有记录(查找关注的人的id)**@paramfromUserId*@return*/…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在使用 Spring Data JPA 的时候,通常我们只需要继承 JpaRepository 就能获得大部分常用的增删改查的方法。有时候我们需要自定义一些查询方法,可以写自定义 HQL 语句

像这样

    /**
     * 根据关注者id查找所有记录(查找关注的人的id)
     *
     * @param fromUserId
     * @return
     */
    @Query("select toUserId from Relationship where fromUserId =:fromUserId")
    List<Long> findByFromUserId(@Param("fromUserId") Long fromUserId);

但是,有时候一些查询比较复杂,当我们把 SQL 语句写好了,却不知道如何转成 HQL 语句,怎么办?

很简单,Spring Data JPA 其实也支持自定义 SQL 语句查询。

比如,我们这里写了一条稍微复杂一些的 SQL 语句。

SELECT DISTINCT t1.from_user_id FROM
(SELECT * FROM relationship WHERE to_user_id = 1)  AS t1
INNER JOIN relationship t2 ON t1.from_user_id = t2.to_user_id

这段 SQL 语句的作用是 查询id=1的用户的互相关注的用户的id。

如何让 JPA 帮我们查询呢?

只需要在后面加一个 nativeQuery = true 就行,哇,是不是很简单!

赶紧试试。

@Query(value = "SELECT DISTINCT t1.to_user_id FROM (SELECT * FROM relationship WHERE from_user_id = ?1)  AS t1 INNER JOIN relationship t2 ON t1.to_user_id = t2.from_user_id ", nativeQuery = true)
List<Long> findFriendsByUserId(Long userId);

写个测试方法

package com.liuyanzhao.forum.repository;

import com.liuyanzhao.forum.entity.Relationship;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;


/**
 * @author 言曌
 * @date 2018/4/24 下午9:56
 */

@SpringBootTest
@RunWith(SpringRunner.class)
public class RelationshipRepositoryTest {


    @Autowired
    private RelationshipRepository relationshipRepository;


    @Before
    public void save() {
        relationshipRepository.save(new Relationship(1L,2L));
        relationshipRepository.save(new Relationship(1L,3L));
        relationshipRepository.save(new Relationship(1L,4L));
        relationshipRepository.save(new Relationship(2L,1L));
        relationshipRepository.save(new Relationship(2L,4L));
        relationshipRepository.save(new Relationship(3L,1L));
    }



    @Test
    public void findFriendsByUserId() throws Exception {
        List<Long> ids = relationshipRepository.findFriendsByUserId(1L);
        System.out.println(ids);
    }

}

最终查得结果 [2,3],答案正确

有坑

我们上面查到是[2,3],这两个数都是 bigint 类型的,如果我们将这两个数传参到其他方法里,比如

/**
  * 根据id集合查询用户
  *
  * @param ids
  * @return
  */
 List<User> findByIdIn(List<Long> ids);

会出现参数类型不匹配。

所以,这里我们可以把 id 的 Long 类型改成 Integer 类型,数据表里的 bigint 改成int

文档直达:https://docs.spring.io/spring-data/jpa/docs/1.10.2.RELEASE/reference/html/#jpa.query-methods.at-query

原文地址:https://liuyanzhao.com/8069.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180064.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • bug生命周期的状态

    bug生命周期的状态从一个bug被发现到这个bug被关闭这一段时间,bug可能会有以下状态:new,openPostpone,PendingRetest,Retest,PendingReject,Reject,Deferred,closed.(请注意这里有很多种状态,我们需要根据不同情况来决定怎样或者是否需要跟开发人员沟通)  下面就对这几种状态进行以下解释:  New:(新的)  当

    2022年10月8日
  • 计算机键盘最小化,电脑按哪个键可以使窗口最小化

    电脑上的快捷键有很多,那么你知道怎么才能快速最小化窗口吗?下面由学习啦小编为你整理了电脑按哪个键可以使窗口最小化的相关方法,希望对你有帮助!电脑最小化窗口的解决方法和步骤如下从某些方式来说,使用键盘上面的几个组合键也可以起到最小化当前页面的作用,当然,好东西都是要留在最后的嘛。所以先看看这个用途不广的方法吧,就是按下键盘上面的Alt键+Space(空格键),这个可以调出所谓的菜单选项,然后按下N键…

    2022年4月9日
  • 一步步学习Linux开发环境搭建与使用

    一步步学习Linux开发环境搭建与使用

    2022年1月22日
  • K8S 部署电商项目

    K8S 部署电商项目K8S部署电商项目

    2022年5月29日
  • 【Web攻防】红队外围信息收集【总结】

    【Web攻防】红队外围信息收集【总结】​外围打点前言由于红队不同于一般的渗透测试,强调更多的是如何搞进去拿到相应机器权限或者实现某特定目的,而不局限于你一定要在什么时间,用什么技术或者必须通过什么途径去搞,相比传统渗透测试,红队则更趋于真实的入侵活动,这种场景其实对防御者的实战对抗经验和技术深度都是比较大的挑战信息收集方式一般采取以下几种方式在搜索引擎(如:baidu、google)进行搜索: 主站相关联的链接,主站链接下可能会放置跳转,如邮件、OA等相关系统。 主站子域名进行搜索,通过二级或三级域名进行目标搜索相.

    2022年6月22日
  • JVM内存模型详解(1.7与1.8的区别)[通俗易懂]

    JVM内存模型详解(1.7与1.8的区别)[通俗易懂]文章目录1.JDK、JRE、JVM关系2.JAVA程序的运行(为什么java可以跨平台)3.JVM运行时数据区1.JDK、JRE、JVM关系从图中就可以很清晰的看清他们之间的关系:JDK>JRE>JVM2.JAVA程序的运行(为什么java可以跨平台)比如我们编写一个HelloWord.java,他是如何运行的呢因为有JVM,所以我们在不同平台只需要下载对应的JDK即可…

    2022年5月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号