ormlite:

foreign = true

の定義を施した場合、結合先レコードが存在しなくとも結合先空オブジェクトが作成された。
恐らく、その他の定義が必要もしくは設定でnullになると思われるけど、デフォルトでは作成される。

canBeNull = true

を同時に与えても結果は同じ。外部キーがNULLだろうが0だろうが外部結合先が無いのだからオブジェクト参照としてnullが筋だと思うのですけど。どうもログ見ていると、結合というより別途検索して結合オブジェクトを作成しているぽくて、問題の空結合に関しては最初から検索さえしていない。
のにゅのにゅ、空オブジェクト作成している。
イミフ。
もーイミフ。
ちゅか、これの所為でめちゃくちゃ重い。
使えねーて、ログ見ていたらGCがグリングリンしていたりする。
4.25ではそのバグが直されていると言われていたので、4.20から4.25に変更。
ちょいと今の構造は相互参照ありきにしてあるので、結合せずに別途検索すれば(いやいやあり得ない)凌げるけれども、どう考えても使い方に手落ちがあると考えた方が良い。
しかし、ForeignEmptyObjectちゅうバグが報告に挙がっている以上、どちらを疑えば良いのか悩む。
ますます、泥のモチベが下がる。
ダメだ。
頭冷やそう。
大元をコードリーディングするしか解決策が浮かばない。

QueryBuilderに渡すカラム名は物理カラム名というところが直感的にアレって感じ。
DAOを介する訳だから、オブジェクトとしてのインタフェースであるべきと思うのです。プロパティと物理カラムの差分吸収はモデル定義(@DatabaseField(columnName = "XXX"))で行っているので。確かにパラメタはColumnNameとしてあり、Propertyではないでしょ?と言われればそれまでですけどね。これこれこういう場合、プロパティではなくてカラム名でないとダメでしょ?という納得するケースが発生すれば良いのですが。
解せない。