-2

我有一种spring repository方法native

@Repository
public interface MessageRepository extends JpaRepository<Message, String> {
    @Query(value = "select sm.* from MESSAGES ...", nativeQuery = true)
    List<Message> findReadyToSend();
}

这个查询是针对 Oracle 的,但我也有 PostgreSQL,我需要为 PostgreSQL 创建本机查询,当我使用 Postgres 配置文件启动我的 spring boot 服务器时,我需要使用这个查询。当我从 Oracle 配置文件开始时,我需要使用 Oracle 查询。

例如,我可以将查询字符串移动到配置文件:

in oracle profile config:
query=select sm.* from MESSAGES ... (oracle)

in Postgre profile config:
query=select sm.* from MESSAGES ... (PostgreSQL)

但是如何将此字符串传递给@Query注释?像这样的东西:

String query - get from config;

@Query(value = query)

也许有正确的方法可以做到这一点?

4

1 回答 1

0

我的想法是提供两个良好的老式接口实现并添加@Profile 注释,以指示根据活动的弹簧配置文件激活哪个bean。

所以界面将是:

public interface MessageRepository extends JpaRepository<Message, String> {
    List<Message> findReadyToSend();
}

您将有两种实现,一种用于 Oracle,另一种用于 Postgres:

   @Profile("Oracle")
   @Repository
    public class MessageRepositoryOracleImpl implements MessageRepository  {

    @Override
    List<Message> findReadyToSend(){
    Query oracleQuery = .....
    return result;
    }
        .....

.

 @Profile("Postgres")
 @Repository
 public class MessageRepositoryPostgresImpl implements MessageRepository  {

    @Override
    List<Message> findReadyToSend(){
    Query postgresQuery = .....
    return result;
    }
        ....

确保 Spring 上下文选择了实现。从 @Repository 注释中,我假设您正在使用组件扫描。如果没有,那么您需要在 Java 配置中定义 bean 并在那里使用 @Profile 注释。

于 2018-10-05T08:28:19.180 回答