在编码的过程中,有时因业务逻辑需要,一个关键字有多个数值,且在调用过程中,此关键字数值对应的各位数值有不同的业务需求,就需要对常量进行位运算;
eg:有关键字status,其中(注:位指二进制运算对应的位):
位1:是否被屏蔽? 1-是,0-否
位2:是否包含视频? 1-是,0-否
位3:是否审核通过? 1-是,0-否
位4:是否已删除? 1-是,0-否
位5:是否有过审核动作? 1-是,0-否
位6:是否将帖子显示在未登陆状态下的列表中?1-是,0-否
可定义如下常量类:
public class GlobalConstantsUtil {
/**
* Constants defined for [BLOG] table, [status] field.
*/
public static final Long BLOG_SHIELD = 1L;
public static final Long BLOG_HAS_VIDEO = 2L;
public static final Long BLOG_AUDITED = 4L;
public static final Long BLOG_DELETED = 8L;
public static final Long BLOG_HAS_AUDITOPERATION = 16L;
public static final Long BLOG_SHOWONHOMEPAGE = 32L;
}
在执行业务时,需求为:未被屏蔽,通过审核,未删除,将帖子显示在未登陆状态下的列表中。
可设置如下变量,通过位运算得出相关值:
Long blogExpected = GlobalConstantsUtil.BLOG_AUDITED | GlobalConstantsUtil.BLOG_SHOWONHOMEPAGE; //审核通过,将帖子显示在未登陆状态下的列表中 36L
Long excluedStatus = GlobalConstantsUtil.BLOG_SHIELD | GlobalConstantsUtil.BLOG_DELETED; // 被屏蔽,被删除 9L
执行sql语句:
@Query(nativeQuery = true, value = "select * from blog where transfer = 0 and (status & (?1) = (?1)) and (status & (?2) != (?2)) ORDER By create_time desc limit 0, 10")
List<Blog> getBlogListForNotLoginUsers(Long blogExpected, Long excludedStatus);