Mybatis:如何检查一行是否存在并返回布尔值?

6
数据库是MySQL。代码应该如下所示:
public interface UserMapper {
    @Select("....")
    boolean checkUserExists(@Param("email") String email);
}

如何编写SELECT SQL语句?(可以使用Exists吗?)

7个回答

24

是的,你可以使用EXISTS

@Select("SELECT EXISTS(SELECT 1 FROM my_table WHERE email=#{email})")
boolean checkUserExists(@Param("email") String email);
请注意,“SELECT 1”是有原因的,您不需要选择任何实际的列。

3
我终于找到了一个解决方案:
public interface UserMapper {
    @Select("SELECT " 
           + " CASE WHEN Count(email)>0 THEN 1 " 
           + " ELSE 0 END Result "
           + " FROM TUser "
           +"  WHERE email=#{email}")
    boolean checkUserExists(@Param("email") String email);
}

1
为了让MyBatis识别真或假,这个查询应该返回0或1,我们使用COALESCE来实现。 当查询返回值为1时,如果返回null,COALESCE将返回0。 请确保你的查询只返回一条记录。
public interface UserMapper {
    @Select("SELECT COALESCE ((SELECT 1 FROM TUser WHERE email=#{email}), 0) ")
    boolean checkUserExists(@Param("email") String email);
}

允许用户创建语句而不是在MySQL存储过程中定义它来验证数据,意味着可能会对数据库进行注入攻击。 - easleyfixed

0

这里是:

 SELECT * 
    FROM information_schema.COLUMNS 
    WHERE 
        TABLE_SCHEMA = 'db_name' 
    AND TABLE_NAME = 'table_name' 
    AND COLUMN_NAME = 'column_name'

0
您可以在 Mapper 中返回一个用户列表并检查它的大小是否大于0。

0

@Select("SELECT EXISTS(SELECT 1 FROM my_table WHERE email=#{email})") boolean checkUserExists(@Param("email") String email);

没有必要使用函数"EXISTS(...)"。

通常我喜欢这样做。

@Select("select 1 from my_table where email = #{email} limit 1")
Optional<Boolean> checkUserExists(@Param("email") String email)

0

与Zach的答案类似,对于DB2,您必须使用CASE。该代码使用旧的mapper.xml文件,而不是注释。

<select id="isBenefitPatternAReviewGroup" resultType="boolean">

SELECT   Distinct
                CASE
                WHEN VAL > 0 THEN 'true'
                ELSE 'false'
                END
        FROM (
            SELECT  count(*) AS VAL
            FROM table_user 
            WHERE email=#{email}
;

</select>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接