用于Null值的JPA Eclipselink PostgreSQL查询字段

时间:2016-09-17 14:21:59

标签: jpa eclipselink postgresql-9.4 glassfish-4.1

我偶然发现了JPA Eclipselink和PostgreSQL的一个非常奇怪的行为。

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

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

Java EE实体Bean:

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

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

使用简单JPA查询的无状态Bean:

    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());
    }

结果:

Aspected:id为2的行,名称字段为null 当前行为:未返回任何行

当我使用&#34;为空时&#34;而不是JPA Query中的上述示例。然后我回来了。

JPA做什么?

select * from test where t.name = null

这应该与

不一样
select * from test where t.name is null

1 个答案:

答案 0 :(得分:0)

JPQL也有&#39;为空&#39;您需要用于比较空值的比较器。虽然一些JPA提供程序可以解释并确定传递给相等的值为null,因此使用&#34; IS NULL&#34;在生成的SQL中,当值可以更改时使用参数通常不可行,因为这意味着查询下面的语句也必须更改。