JPA:如何将@namedStoredProcedureRequesty与@NamedQuery结合起来执行周界搜索?

JPA:如何将@namedStoredProcedureRequesty与@NamedQuery结合起来执行周界搜索?,jpa,stored-procedures,multiple-inheritance,named-query,Jpa,Stored Procedures,Multiple Inheritance,Named Query,我有一些从父实体a继承的实体B和C。因此,我的数据库中有一个连接的多重继承结构。 此外,我在这些实体上定义了一些@namedquery,它们工作得很好。 我打算有一个@NamedStoredProcedureQuery,它能够在周界中找到一些POI。我已经实现了一个存储过程,它在父表上执行SELECT,将经度、纬度和半径作为参数,然后调用返回正确的记录。要执行周界搜索的列都在父表/实体中 现在我想使用与继承实体相关的JPA从Java调用这个存储过程。这意味着对B类实体的周界搜索应返回周界内的所有

我有一些从父实体a继承的实体B和C。因此,我的数据库中有一个连接的多重继承结构。 此外,我在这些实体上定义了一些@namedquery,它们工作得很好。 我打算有一个@NamedStoredProcedureQuery,它能够在周界中找到一些POI。我已经实现了一个存储过程,它在父表上执行SELECT,将经度、纬度和半径作为参数,然后调用返回正确的记录。要执行周界搜索的列都在父表/实体中

现在我想使用与继承实体相关的JPA从Java调用这个存储过程。这意味着对B类实体的周界搜索应返回周界内的所有B类POI

在父实体类中定义@NamedStoredProcedureQuery是否足够?
如何从子类中的@NamedQuery中调用这样的@namedStoredProcedureRequesty?

我创建了一个存储过程,其中包含必要的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

通过这种方式,我确信正确的实体表使用的是相反的字符串文字。

JPQL查询不能调用存储过程,因此NamedQuery不能调用NamedStoredProcedureRequesty。您自己使用JPA API调用它们,您使用哪个JPA实现?
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());