2012-09-04 31 views
1

我有兩個實體使用表達

@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; 
    ... 
} 

的表MASTERDETAIL,其中那些實體persisted,真的老了dBASE表(.dbf files with .mdx indexes)有一些特殊性,最糟糕的是那種指標,他們使用。

表詳細信息有一個基於表達式「str(MASTER,7)」的索引,並且該索引僅在jdbc驅動程序使用,如果sql sentece使用相同的公式。

通過上面的代碼,即執行檢索主人的細節sql聲明

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

,並且不使用index,這樣的表現是非常非常糟糕。

有沒有我可以註釋類,以便執行的SQL是

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

我不介意使用eclipselink擴展(或移動到hibernate)如果我有什麼辦法。

如果這是不可能的,那麼最好的選擇是什麼?

回答

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。