1

我有一个实体(Entity1),其 id 和一个字符串作为唯一字段:

@Id
    @GeneratedValue
    @Column(name = "entity1_id")
    private long entity1_id;

    @Column(name = "address", nullable = false, unique = true)
    private String address;

以这种方式与另一个实体(Entity2)有关系:

@ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "middle_table", joinColumns = @JoinColumn(name = entity2_id), inverseJoinColumns = @JoinColumn(name = "entity1_id"))
    private List<Entity> entity1List= new ArrayList<Entity>();

FetchType 是急切的,所以当我从数据库中获取一个 Object2 时,它带有 Entity1 的完整列表。问题是该address字段应该是小写的,但是由于迁移问题,我们在某些情况下地址包含一些大写字母。在这些情况下Entity2.entity1List,数组包含 1 个对象,该对象为空,因为在数据库中找不到它。当中间表被更新时,我得到了这个异常:

错误:“entity1_id”列中的空值违反非空约束 {prepstmnt 892492234 INSERT INTO public.middle_table(entity2_id, entity1_id) VALUES (?, ?) [params=?, ?]} [code=0, state=23502]

为了更清楚,假设我在数据库中有:Test@test.com,但它应该和test@test.com.

编辑

我刚刚意识到整个解释是不必要的。我可以用更简单的方式解释我的问题:
在我的表中,我有一个条目:Test@test.com. 我想要这个查询:

select * from my_table where address = 'test@test.com'

检索结果。

4

1 回答 1

1

在我的表中,我有一个条目:Test@test.com。我想要这个查询:

select * from my_table where address = 'test@test.com'

好吧,如果您这样说,您不妨将查询重组为:

select * from my_table where LOWER(address) = LOWER(:email)

为了使这个查询高效,您需要在数据库上建立一个基于函数的索引——否则它是 O(n) 复杂的。

于 2013-02-16T00:48:15.480 回答