代码之家  ›  专栏  ›  技术社区  ›  ip696

在Spring@query注释中为Oracle/PostgreSql使用特定的本机查询

  •  -2
  • ip696  · 技术社区  · 7 年前

    我有一个方法 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引导服务器时,我需要使用这个查询。当我开始使用Oracle概要文件时,我需要使用queryfororacle。

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

    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)
    

    也许有一个正确的方法?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Nullbeans    6 年前

    我的想法是提供两个老式的接口实现,并添加@Profile注释,以便根据活动的spring配置文件指示要激活哪个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注释。

    推荐文章