0

我有服务:

@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 profile如果我用我调用findReadyToSendOracle方法和 if postgre profile-方法启动 spring boot 服务器findReadyToSendPostgre。这行得通。但是这个解决方案很糟糕。我认为。因为我为配置文件检查编写硬代码。我的存储库有 2 种用于不同数据库的方法。

如何正确实施?

4

1 回答 1

1

您在适应 JPQL 的过程中遇到了哪些问题?使用本机/自定义函数?它可能看起来太难了,但您可能会找到一种使用标准 + JPA 2.1+ 中的函数函数的方法,看看这篇文章

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

如果您提供一个接口,其中包含扩展 JpaRepository 的预期本机查询方法,如下所示:

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

    List<Message> findByReady();

}

请注意@NoRepositoryBean,避免使用配置文件专业化的重复 bean。

然后,只需根据您的需要提供您的实现:

@Repository
@Profile("oracle")
public interface MessageOracleRepository extends MessageRepository {

    @Query(value = "select m.* from Message m where m.ready = false", nativeQuery = true)
    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();

}

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

如您所见,为了简单起见,我简化了查询。使用修改后的代码查看此存储库。

于 2018-10-07T05:23:39.473 回答