Spring数据JPA+本机查询-根据配置文件替换查询字符串

Spring数据JPA+本机查询-根据配置文件替换查询字符串,spring,spring-data-jpa,spring-data,spring-repositories,Spring,Spring Data Jpa,Spring Data,Spring Repositories,我有以下服务: @Service public class MessageServiceImpl implements MessageService { private final MessageRepository smevMessageRepository; private final Environment environment; public MessageServiceImpl(MessageRepository messageRepository, En

我有以下服务:

@Service
public class MessageServiceImpl implements MessageService {

    private final MessageRepository smevMessageRepository;
    private final Environment environment;

    public MessageServiceImpl(MessageRepository messageRepository, Environment environment) {
        this.messageRepository= messageRepository;
        this.environment = environment;
    }

    @Override
    public List<Message> findReadyToSend() {
        if (environment.acceptsProfiles("postgre")) {
            return messageRepository.findReadyToSendPostgre();
        }
        return messageRepository.findReadyToSendOracle();
    } 
这是我的存储库:

@Repository
public interface MessageRepository extends JpaRepository<Message, String> {

    @Query(value = "select sm.* from MESSAGES sm ...", nativeQuery = true)
    List<Message> findReadyToSendOracle();

    @Query(value = "select sm.* from MESSAGES sm ...", nativeQuery = true)
    List<Message> findReadyToSendPostgre();
如果我使用oracle概要文件启动spring引导服务器,我将调用FindArderyToSendOracle方法,如果使用postgre概要文件-FindArderyToSendPostgre方法。它起作用了。但这个解决方案是不好的。我想。因为我写的是档案检查的硬代码。我的存储库有两种不同的数据库方法


如何正确实现这一点?

您在适应JPQL时面临哪些问题?使用本机/自定义函数?这看起来可能太难了,但您可能会找到一种使用criteria+的方法,JPA2.1+中的函数,请看

另一方面,我在这里找到了一个可能有用的老方法。有一种简单的方法可以解决这个问题,使用一些带有@Profile注释的快捷方式和一些额外的接口

如果您提供了一个带有扩展JpaRepository的预期本机查询方法的接口,如下所示:

@NoRepositoryBean
public interface MessageRepository extends JpaRepository<Message, String>{

    List<Message> findByReady();

}
。。。而且

@Repository
@Profile("mysql")
public interface MessageMySQLRepository extends MessageRepository {

    @Query(value = "select m.* from Message m where m.ready = true", nativeQuery = true)
    List<Message> findByReady();

}
现在,您只需要提供所需的概要文件、注入和使用正确的本机查询


如您所见,为了简单起见,我简化了查询。使用经过修改的代码查看一下这一点。

正确的方法是——您应该以独立于供应商的方式构建对数据库的请求。您可以显示您的本机查询以重新查看是否可以以更通用的方式重新编写它们吗?@star67 Ok尝试选择sm.*从消息sm,其中sm.delivery_finished=0,sm.last_sent_date为空,或者从现在算起第二秒-sm.last_sent_date*24*60>sm.delay和sm.STATUS='REQUEST_READY'命令由COALESCEsm.last_sent_date,到2000.01.01,yyyy-MM-dd,你们真的认为若能用JPQL解决它,我会很痛苦吗?
@Repository
@Profile("mysql")
public interface MessageMySQLRepository extends MessageRepository {

    @Query(value = "select m.* from Message m where m.ready = true", nativeQuery = true)
    List<Message> findByReady();

}