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

这些实体所在的表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 的 Expression 或 SQL,

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

如果您尝试自定义 find() 查询,则可以使用 DescriptorCustomizer 覆盖描述符的 queryManager 上 readObject 的 SQL。

于 2012-09-05T13:56:45.020 回答