我有两个实体
@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
的表DETAIL
和persisted
实际上是旧的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
)。
如果不可能,最好的选择是什么?
答案 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。