1

Squeryl(scala 2.8.1の場合は0.9.4)の動的クエリ(.?およびinhibitWhen(...))を使用しようとしています。String / Int / whateverフィールドを使用している間は正常に機能していますが、ブール条件での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唯一の動作バージョンは、コンパイラのヒントとしてdoubleを使用します。

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

ブール値を使用して動的クエリを実行するためのより適切な方法はありますか?

4

1 に答える 1

1

うーん...これはおそらくブール値->論理ブール値からの暗黙の変換によって引き起こされた別のバグだと思います。この機能は、これと同様の問題のために0.9.5で非推奨になりました。何。?ブール式->ブール式から暗黙の変換をトリガーする必要がありますが、LogicalBooleanには。?メソッドにも競合があり、後者が優先されるようです。私はそれがひどくきれいではないことを知っていますが、これを試してください:

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

。〜は、。?の前にBooleanExpression[Option[Boolean]]への変換を強制する必要があります。が呼び出されます。

于 2011-10-03T20:59:30.097 に答える