【问题标题】:Varchar column case insensitive OpenJpaVarchar 列不区分大小写 OpenJpa
【发布时间】:2013-02-13 10:37:32
【问题描述】:

我有一个实体 (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) 值 (?, ?) [params=?, ?]} [code=0, state=23502]

为了更清楚,假设我在数据库中有:Test@test.com,但它应该与test@test.com 一样好识别。

编辑

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

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

检索结果。

【问题讨论】:

    标签: openjpa


    【解决方案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)。

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 1970-01-01
      • 2010-10-23
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2013-03-06
      • 2020-02-18
      相关资源
      最近更新 更多