1

私は2つのエンティティを持っています

@Entity  
@Table(name="MASTER")  
public class Master {  
    @Id  
    @Column(name="MASTER")  
    private Integer id;  

    @OneToMany(mappedBy="master")  
    private List<Detail> details;    

    ...  
}  

@Entity  
@Table(name="DETAIL")  
public class Detail {  
    @ManyToOne  
    @JoinColumn(name="MASTER",referencedColumnName="MASTER")
    private Master master;
    ...  
}

これらのエンティティが であるテーブルMASTERおよびは、実際にはいくつかの特殊性を持つ古い dbase テーブルであり、最悪の場合、それらが使用するインデックスの種類です。DETAILpersisted(.dbf files with .mdx indexes)

テーブル DETAIL には式 "str(MASTER, 7)" に基づくインデックスがあり、そのインデックスは、SQL 文が同じ式を使用する場合にのみ jdbc ドライバーによって使用されます。

上記のコードsqlでは、マスターの詳細を取得するために実行されるステートメントは次のとおりです。

SELECT MASTER, ..., FROM DETAIL WHERE MASTER = ?

を使用しないindexため、パフォーマンスは非常に悪いです。

実行される SQL が

SELECT MASTER, ..., FROM DETAIL WHERE STR(MASTER,7) = STR(?,7)?  

eclipselink必要に応じて、拡張機能を使用する (または に移動する) ことは気にしませんhibernate

それが不可能な場合、最良の代替手段は何ですか?

4

1 に答える 1

0

クエリがJPQLの場合、使用できます。

Select d from Detail d where FUNC('STR', d.master.id, 7) = FUNC('STR', :id, 7)

マッピングをカスタマイズしようとしている場合は、DescriptorCustomizerを使用して、selectQueryの式またはSQLをオーバーライドできます。

mapping.setSelectionSQLString("select * from detail where str(master, 7) = str(#MASTER, 7)")

find()クエリをカスタマイズしようとしている場合は、DescriptorCustomizerを使用して、記述子のqueryManager上のreadObjectのSQLをオーバーライドできます。

于 2012-09-05T13:56:45.020 に答える