我偶然发现了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
答案 0 :(得分:0)
JPQL也有&#39;为空&#39;您需要用于比较空值的比较器。虽然一些JPA提供程序可以解释并确定传递给相等的值为null,因此使用&#34; IS NULL&#34;在生成的SQL中,当值可以更改时使用参数通常不可行,因为这意味着查询下面的语句也必须更改。