如何在QueryDSL中结合返回布尔值的方法与BooleanExpression?
解决方案
你的问题出在Querydsl的or方法要求传入BooleanExpression类型参数,而你传入的是普通boolean值,类型不匹配导致报错。以下两种可行的实现方式:
方式一:将布尔值转为BooleanExpression
使用Querydsl提供的BooleanExpression.constant()方法,把isEditor这个布尔值包装成BooleanExpression,这样就能和原表达式组合:
private boolean isEditor(User user){ // some complex logic } QMessage message = QMessage.message; User user = getAuthenticatedUser(); boolean isEditor = isEditor(user); BooleanExpression canRead = message.author.id.eq(user.getId()) .or(BooleanExpression.constant(isEditor));
方式二:提前判断全局权限
如果用户具备编辑角色时可以查看所有消息,没必要把这个条件拼进查询表达式,直接分支处理更高效:
private boolean isEditor(User user){ // some complex logic } QMessage message = QMessage.message; User user = getAuthenticatedUser(); boolean isEditor = isEditor(user); BooleanExpression canRead; if (isEditor) { // 编辑用户能看所有消息,条件为恒真 canRead = BooleanExpression.TRUE; } else { // 非编辑用户只能看自己发的消息 canRead = message.author.id.eq(user.getId()); }
这两种方式都能实现你要的权限控制逻辑,根据实际场景选择即可。
内容的提问来源于stack exchange,提问作者Johannes Pertl
相关产品推荐
相关产品推荐

