Squeryl中的布尔动态查询

时间:2011-09-30 07:49:11

标签: scala squeryl

我正在尝试使用Squeryl(对于scala 2.8.1为0.9.4)动态查询(.?inhibitWhen(...))。当我使用String / Int /任何字段时,它们工作正常,但似乎干扰了squeryl的布尔条件的语法糖。

假设我们在某处定义了is_trusted: Option[Boolean],请使用以下代码

where ( obj => 
  obj.is_trusted === is_trusted.?
)

无法编译,抛出以下错误:

... type mismatch;
[error]  found   : org.squeryl.dsl.ast.LogicalBoolean
[error]  required: org.squeryl.dsl.NonNumericalExpression[org.squeryl.PrimitiveTypeMode.BooleanType]
[error]     obj.is_trusted === is_trusted.?
[error]                                   ^

即使这个不起作用,在第一个条件下失败:

where ( obj => 
  obj.is_trusted.inhibitWhen(is_trusted == Some(true)) and
  not(obj.is_trusted).inhibitWhen(is_trusted == Some(false))
)

唯一可用的版本使用双not作为编译器的提示:

not(not(obj.is_trusted)).inhibitWhen(is_trusted != Some(true)) and
not(obj.is_trusted).inhibitWhen(is_trusted != Some(false))

使用布尔值进行动态查询是否有更明智的方法?

1 个答案:

答案 0 :(得分:1)

嗯......我认为这可能是由布尔隐式转换引起的另一个错误 - > LogicalBoolean。由于与此类似的问题,该功能已在0.9.5中弃用。什么。应该做的是触发布尔的隐式转换 - > BooleanExpression但由于LogicalBoolean有一个。?方法也存在冲突,后者似乎具有优先权。我知道它不是很漂亮,但试试这个:

where ( obj => 
  obj.is_trusted === is_trusted.~.?
)

。应该强制转换为BooleanExpression [Option [Boolean]]。?被调用。