2016-09-17 8 views
0

Я наткнулся на очень странное поведение с JPA Eclipselink и PostgreSQL.JPA Eclipselink PostgreSQL Поле запроса для значений Null

create table test(id bigint, name varchar(255)) 

insert into test values(1, "hello") 
insert into test values(2, null) 

Java EE Entity Bean:

@Entity 
@Table(name = "test") 
public class Test implements Serializable { 

    @Id 
    @Column(name = "id") 
    private Long id; 
    @Column(name = "name") 
    private String name; 

Stateless Фасоль с простым JPA Query:

TypedQuery<Test> q = em.createQuery("select t from Test t where t.name = :name", Test.class); 
    q.setParameter("name", null); 
    List<Test> list = q.getResultList(); 
    for (Test t : list) { 
     System.out.println(t.getId() + " " + t.getName()); 
    } 

Результат:

аспектировано: Ряд с идентификатором = 2 с нулем в названии поле Текущее поведение: не возвращено ни одной строки

Когда я использую «null» вместо примера выше в JPA Query. Тогда я что-то верну.

Что делает JPA?

select * from test where t.name = null 

если это не будет таким же, как

select * from test where t.name is null 
+0

Ваш запрос содержит 't.name =: name', так что это то, что отправлено в базу данных –

+0

Тогда для postgresql" null "и" = null "это не одно и то же? –

+0

Нет, это не так. Вы не можете сравнивать 'NULL' с' = 'в SQL (так определяется SQL) https://www.postgresql.org/docs/9.5/static/functions-comparison.html –

ответ

0

JPQL также имеет «равна нулю» компаратор, который вы должны использовать для сравнения с нулевыми значениями. Хотя некоторые поставщики JPA могут интерпретировать и определять, что значение, переданное в равенство, равно null, и поэтому использовать «IS NULL» в сгенерированном SQL, это обычно нецелесообразно при использовании параметров, когда значение может меняться, так как это означает, что выражение под запрос также должен измениться.

+0

Вы правы. Но это делает невозможным запись одного запроса для нулевых, а не нулевых значений, если вы не хотите увеличивать compexitiy. Поскольку я привык к Sybase, это различие является новым и также кажется мне немного бесполезным. Я также узнал, что можно изменить конфигурацию postgresql, которая автоматически преобразует значение «= null» в «null», –