gpt4 book ai didi

spring-boot - Spring 数据JPA : using property in @Query as parameter

转载 作者:行者123 更新时间:2023-12-02 21:50:29 26 4
gpt4 key购买 nike

我有几个 application-x.properties 文件,它们用于不同的配置文件,每个文件都包含一个属性,每个配置文件都有特定值。我想在数据库查询中使用此属性作为参数。

是否可以使用 SpEL 或其他方式添加它?

例如application.properties:

query.parameters.role: ADMIN

可能的用途:

@Query(value = "select u from User u where u.role = :#{query.parameters.role}")
Set<User> getAllUsers();

最佳答案

您可以通过以下方式完成:

1.- 使用 Repository Query Keywords 按角色查找所有用户

@Repository
public interface UserRepository extends JpaRepository<User, UUID> {

Set<User> findByRole(String role);
}

2.- 在 UserService 中创建一个名为 getAllUsers 的方法,并使用 @Value 获取角色值:

@Service
public class UserService {

@Autowired
private UserRepository repository;

@Value("${query.parameters.role}")
private String role;

public Set<User> getAllUsers() {
return repository.findByRole(role);
}
}

回答这个问题的其他方法是实现一个由@Query支持的自定义SpEL,你可以看看这个SpEL support in Spring Data JPA

那么您应该针对您的情况执行以下步骤:

1.- 创建一个 ConfigProperties 类,以便您可以读取并获取 application.properties

@Configuration
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix = "query")
public class ConfigProperties {

private Parameters parameters;

// standard getters and setters
}

public class Parameters {

private String role;

// standard getters and setters
}

2.- 实现自定义 EvaluationContextExtensionSupport 并引用 ConfigProperties

public class PropertyEvaluationContextExtension extends EvaluationContextExtensionSupport {

private final ConfigProperties configProperties;

public PropertyEvaluationContextExtension(final ConfigProperties configProperties) {
this.configProperties= configProperties;
}
@Override
public String getExtensionId() {
return "properties";
}

@Override
public ConfigProperties getRootObject() {
return this.configProperties;
}
}

3.- 创建一个 bean 以便调用您的自定义 PropertyEvaluationContextExtension

@Configuration
public class CustomConfig {

private final ConfigProperties configProperties;

public CustomConfig(final ConfigProperties configProperties) {
this.configProperties= configProperties;
}

@Bean
EvaluationContextExtensionSupport propertyExtension() {
return new PropertyEvaluationContextExtension(configProperties);
}
}

4.- 通过以下格式调用query.parameters.role:?#{query.parameters.role}

@Query(value = "SELECT u FROM User u WHERE u.role = ?#{query.parameters.role}")
Set<User> getAllUsers();

关于spring-boot - Spring 数据JPA : using property in @Query as parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58615001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com