在OneToMany关系中使用表达式

时间:2012-09-04 18:06:39

标签: jpa

我有两个实体

@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的表DETAILpersisted实际上是旧的dbase表(.dbf files with .mdx indexes),具有一些特殊性,最糟糕的是它们使用的索引类型

表DETAIL有一个基于表达式“str(MASTER,7)”的索引,如果sql sentece使用相同的公式,该索引仅由jdbc驱动程序使用。

使用上面的代码,为检索主人的详细信息而执行的sql语句是

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

并且不使用index,因此性能真的非常糟糕。

有没有办法可以对类进行注释,以便执行的SQL是

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

如果必须,我不介意使用eclipselink个扩展程序(或转移到hibernate)。

如果不可能,最好的选择是什么?

1 个答案:

答案 0 :(得分: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。