我有一些实体 B 和 C 继承自父实体 A 。因此,我的数据库中有一个 join,multiple inheritance 结构。
此外,我已经在这些权限上定义了一些 @NamedQueries ,它们运行良好。
我打算有一个 @NamedStoredProcedureQuery ,它可以在周边找到一些POI。我已经实现了一个存储过程,它在父表上执行SELECT,将经度,纬度和 radius 作为参数,CALL返回正确的记录。执行边界搜索的列都在父表/实体中。
现在我想使用与继承实体相关的JPA从Java调用此存储过程。这意味着对 B 类实体的边界搜索应返回周界内 B 类的所有POI。
在父实体类中定义 @NamedStoredProcedureQuery 是否足够?
如何从子类中的@NamedQuery中调用这样的 @NamedStoredProcedureQuery ?
答案 0 :(得分:0)
我使用必要的IN参数创建了一个存储过程,并为要使用的表创建了另一个IN参数。
DELIMITER $$
CREATE PROCEDURE `perimeterSearch`(IN lon double, IN lat double, IN radius double,
IN poiTable varchar(45))
BEGIN
SET @perimeterSearch = CONCAT(
'SELECT
-- poiId,
-- latitude,
-- longitude,
*
FROM
', 'mySchema.', poiTable, ' pt ',
'
LEFT JOIN mySchema.pois p ON p.poiId = pt.poiId
HAVING
-- distance <= radius
(
6371 * acos(
cos(
radians( p.latitude )
) * cos(
radians( ', lat, ' )
) * cos(
radians( p.longitude ) - radians( ', lon, ' )
) + sin(
radians( ', lat, ' )
) * sin(
radians( p.latitude )
)
)
) <= ', radius, '
');
-- ORDER BY
-- distance ASC;
PREPARE stmt FROM @perimeterSearch;
EXECUTE stmt;
END
在我的DAO实现中,我执行
public List<MyPoiPoiEntity> findMyPoisInPerimeter(final double longitude, final double latitude, final double radius){
em = factory.createEntityManager();
final StoredProcedureQuery ppQuery =
em.createStoredProcedureQuery("perimeterSearch", MyPoiEntity.class)
.registerStoredProcedureParameter("longitude", double.class, ParameterMode.IN)
.setParameter("longitude", longitude)
.registerStoredProcedureParameter("latitude", double.class, ParameterMode.IN)
.setParameter("latitude", latitude)
.registerStoredProcedureParameter("radius", double.class, ParameterMode.IN)
.setParameter("radius", radius)
.registerStoredProcedureParameter("poiTable", String.class, ParameterMode.IN)
.setParameter("poiTable", MyPoiEntity.class.getAnnotation(Table.class).name());
final List<MyPoiEntity> cpEntities = ppQuery.getResultList();
em.close();
return cpEntities;
}
使用正确表的技巧是由
完成的.setParameter("poiTable", MyPoiEntity.class.getAnnotation(Table.class).name());
这样我确信使用正确的实体表来使用字符串文字。