JPA NativeQuery中IF条件查询逻辑含义及SQL转换问题
代码含义解释
你贴的是MySQL特有的IF()函数语法,规则为IF(条件判断, 条件成立返回值, 条件不成立返回值),两段代码的具体含义如下:
- 第一段
if(u.id = loginuserId, true, false) equalUserStateloginuserId是业务层传入的当前登录用户ID参数,这段逻辑用来判断当前查询到的用户u是否为登录者本人,匹配则返回true,不匹配返回false,最终返回的字段别名为equalUserState。 - 第二段
if((select true from follow where fromUserId = loginuserId and toUserId = u.id), true, false) as followStatefollow是关注关系表,fromUserId存关注发起者ID,toUserId存被关注者ID。这段逻辑先通过子查询判断「当前登录用户是否已经关注了本次查询到的用户u」,如果存在对应的关注记录就返回true,否则返回false,最终返回的字段别名为followState。
转换为标准SQL写法
MySQL的IF()函数不属于SQL标准,标准SQL使用CASE表达式实现同类逻辑,同时子查询可以替换为效率更高的EXISTS判断,转换后的完整查询如下:
SELECT u.id, u.username, CASE WHEN u.id = loginuserId THEN TRUE ELSE FALSE END AS equalUserState, CASE WHEN EXISTS (SELECT 1 FROM follow WHERE fromUserId = loginuserId AND toUserId = u.id) THEN TRUE ELSE FALSE END AS followState FROM follow f INNER JOIN user u ON f.toUserId = u.id AND f.fromUserId = pageUserId
补充说明:语句里的pageUserId也是业务传入参数,代表当前查看的用户主页ID,整条查询的作用是拉取该用户关注的所有人列表,同时额外标记登录者和这些用户的身份、关注关系。
内容的提问来源于stack exchange,提问作者JB P
相关产品推荐
相关产品推荐

