1

ID と文字列を一意のフィールドとして持つエンティティ ( Entity1 ) があります。

@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" の null 値が not-null 制約に違反しています {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 に答える