【问题标题】:How to get the specific property value from .properties file in Spring Data Repository interface method @Query如何从Spring Data Repository接口方法@Query中的.properties文件中获取特定的属性值
【发布时间】:2018-11-06 11:48:56
【问题描述】:

我可以在 Spring 类中获取属性值,如下所示:

@Value("${database.name}")
private String databaseName;

我必须通过加入不同数据库中的不同表来执行本机查询。

@Query(value="select t1.* FROM db1.table1 t1 INNER JOIN db2.table2 t2 ON t2.t1_id1 = t1.id1")

我必须从属性文件中获取它们,而不是硬编码数据库名称,即此处的 db1 和 db2。

如何获取Spring Data JPA Repository中@Query注解内的属性值?

【问题讨论】:

  • 这里有个很好的问题是你所说的 2 个差异数据库是什么意思?因为如果您谈论的是两个完全不同的数据库服务器,您可能需要配置 2 个数据源,或者您可以谈论 2 个不同的模式,这是另一种情况。
  • 但是在这两种情况下,我想说,您的存储库不应该知道数据库名称。您最好重新考虑您的设计,但如果您无法更改它 - 我假设您将不得不在 @Query 中硬编码 DB 名称。
  • 目前有两种不同的模式。我已经配置使用:medium.com/@joeclever/…
  • 您是否考虑过创建一个服务,在其中注入 entityManager 并使用 entityManager 或条件 API 创建查询,您可以使用它们构建更灵活的查询。您可以将来自.properties 的值注入此服务,然后在使用 EntityManager 构建查询时使用
  • 对于这种特定情况,您可以使用 EntityManager 创建查询,而不是使用存储库(将其注入到您也可以注入 properties 的某个组件)

标签: spring-boot spring-data-jpa


【解决方案1】:

不知道有没有可能,如果没有,可以考虑这个办法:

您可以在查询中使用参数而不是直接使用存储库的 @Query 中的属性,但是当您调用实际方法时 - 您可以提供来自 .properties 的值。

假设你有一个简单的存储库:

public interface UserRepository extends JpaRepository<User, Long> {

  // query with param
  @Query("select u from User u where u.lastname = :lastname")
  User findByLastname(@Param("lastname") String lastname);

}

然后,假设您有一些 ServiceController 需要在其中使用您的 Repository - 您可以在那里注入属性并将它们传递给您的方法:

@Service
public class UserService {

    // this comes from .properties
    @Value("${user.lastName}")
    private String userLastName;

    @Autowired
    private UserRepository userRepository;

    public User getUser() {
        // you pass it as param to the repo method which
        // injects it into query
        return userRepository.findByLastname(userLastName);
    }
}

这只是一个例子。但我相信它可能有用。

黑客愉快:)

【讨论】:

  • 感谢您的回复。是的,我们可以将值发送到存储库方法并可以在@Query 中使用它。它只适用于一个地方。如果我想在一个本机查询中将数据库名称用于不同的连接表。我不认为它的正确方法。
  • 也许您可以添加有关您的案例的更多具体细节?到目前为止,据我了解您正在尝试做的事情-我会说您的设计不好。在查询中添加数据库名称对我来说听起来有些不对劲。
  • 没错,实际上在进行跨模式连接时它是有意义的。我遇到了同样的问题,虽然我能够传递值,因为它有一个“。”在它之后,它没有找到 param 字段,因为它把它当作我试图访问我的 Param 中的一个字段,就像在 paramName.fieldIntheParam 中一样,当我试图使用字符串作为表名点列时在表中。我还必须使架构名称可配置,另一个级别但同样的问题。这是一个非常棘手的问题。
猜你喜欢
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2011-09-16
  • 2018-05-16
  • 1970-01-01
  • 2016-01-03
  • 2018-01-24
相关资源
最近更新 更多