当前位置: 首页 > 知识库问答 >
问题:

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

梁丘洲
2023-03-14

我有一些实体B和C从父实体A继承。因此,我在我的数据库中有一个联合的多重继承结构。此外,我在这些实体上定义了一些@NamedQueries,它们运行良好。
我打算有一个@NamedStoredProcess dureQuery,它能够在外围找到一些POI。我已经实现了一个存储过程,它在父表上执行SELECT,获取经度、纬度和半径作为参数,CALL返回正确的记录。执行外围搜索的列都在父表/实体中。

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

在父实体类中定义@NamedStoredProcess dureQuery就足够了吗?
我如何从子类中的@NamedQuery中调用这样的@NamedStoredProcess dureQuery?

共有1个答案

仉宸
2023-03-14

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

这样,我确信正确的实体表被用于相反的字符串文字。

 类似资料:
  • 我想在React项目的后端合并一个使用语音识别的Python文件。 这里我有一段使用语音识别的Python代码: 我尝试在react组件中导入文件,如下所示: 在这里,我尝试将我的按钮链接到Python文件中的函数: 我收到了它未能编译的消息以及以下内容: 我能做些什么来使这个工作?

  • 我使用https://doc.akka.io/docs/alpakka-kafka/current/consumer.html从kafka使用数据,如下所示: 接下来,我将通过akka http websocket客户端将收到的结果转发到webserver 以下是如何构建websocket客户端: 我有两个问题: > 如何将消费者和websocket客户端组合成一个流,并让它将消息发送到Web服务

  • 为了能够轻松地测试我的SOAP客户机(通过利用MockWebServiceServer),我想使用Spring的WebServiceTemplate。 SOAPendpoint是.NET服务器。基于wsdl,我能够生成bean(主要是请求类)和endpoint接口。 生成的界面如下: SOAPFaultClientException:反序列化操作“CallCheckXML”的请求消息正文时出错。O

  • 我有一个(Spring开机/Spring云)应用程序(微服务'MS'架构)与Netflix工具构建,我想将其部署在kubernetes集群(一个主和2个小跟班),以从其编排事实中获得优势。 顺便说一下,我在集群上创建了一个库贝-dns服务,我还尝试用3个Pod挂载一个eureka服务(名为eurekaservice)。另一方面,我运行了一个带有下一个eureka配置的微服务: 好消息是集群上的每个

  • Usecase:使用EventTime并从Kafka的记录中提取时间戳。 我想要的是:Flink提取时间戳并在初始间隔(例如20秒)内为每条记录发出水印,然后它可以周期性地发出水印(例如每10秒)。 原因:如果我使用PeriodicWatermark,开始时Flink只会在一段时间间隔后发出水印,并且我的第一个窗口(5分钟)中的计数是错误的-比后续窗口中的计数大得多。我有一个解决办法,将自动水印间