JPA с запросом Play Framework для нулевых значений не работает - PullRequest
2 голосов
/ 16 февраля 2012

Может кто-нибудь объяснить мне, почему это работает:

Dependency d = new Dependency();
d.name = "test";
d.release = "";
d.version = "";
d.save();
Dependency D = Dependency.find("byNameAndVersionAndRelease", "test", "", "").first();
assertNotNull(D);

А это не так:

Dependency d = new Dependency();
d.name = "test";
d.release = null;
d.version = null;
d.save();
Dependency D = Dependency.find("byNameAndVersionAndRelease", "test", null, null).first();
assertNotNull(D);

Разве невозможно запросить значения null?

BR, Rene

Ответы [ 2 ]

1 голос
/ 25 декабря 2012

Я не понимаю, почему JPA не может просто позаботиться об этом. Я разделяю ваше разочарование!

Для чего он стоит, я нашел следующее решение работает. Везде, где ваш параметр может быть нулевым (и вы хотите, чтобы запрос возвращал записи с нулевым значением в этом столбце), используйте следующий синтаксис:

String name = "test";
String version = null;
String release = null;
Dependency D = Dependency
    .find("name = :name "
        + "and (version = :version or (version is null and :version is null)) "
        + "and (release = :release or (release is null and :release is null)) ")
    .setParameter("name", name)
    .setParameter("version", version)
    .setParameter("release", release)
    .first();

Очевидно, что это немного более многословно, но вполне читабельно и ясно показывает, что вы можете ожидать, что параметр иногда может быть нулевым.

0 голосов
/ 16 февраля 2012

Да, это возможно, но не так.Это не работает, потому что ваша попытка сводится к Version = null .. , но вам нужно version is null .Вы должны пойти примерно так:

Dependency D = Dependency.find(
"name = ? and version is null and release is null", "test").first();

Другая возможность - написать весь JP QL.

...