我有一个实体( 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个对象,该对象为null,因为它无法在数据库中找到。
当中间表更新时,我得到了这个例外:
错误:“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'
检索结果。
答案 0 :(得分:1)
在我的表格中,我有一个条目:Test@test.com。我想这个问题:
select * from my_table where address = 'test@test.com'
好吧,如果你这样说,你也可以将查询重组为:
select * from my_table where LOWER(address) = LOWER(:email)
要使此查询有效,您的数据库需要function-based index - 否则就是O(n)复杂。