Spring Data JPA:在 @Query 中使用属性作为参数

3

我有几个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个回答

5
您可以按照以下方式完成:

1. 使用存储库查询关键字按角色查找所有用户

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

    Set<User> findByRole(String role);
}

2. 在UserService中创建一个名为getAllUsers的方法,并使用@Value获取role value

@Service
public class UserService {

    @Autowired
    private UserRepository repository;

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

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

另一种回答这个问题的方法是实现一个自定义的SpEL,并且被@Query支持。你可以查看这个Spring Data JPA中的SpEL支持
然后,你应该按照以下步骤进行:
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();

谢谢,我知道这个解决方案,但我想知道是否可以直接在存储库中设置属性。 - boden
好的,就目前而言,我知道这是不可能的,但我会添加其他实现方式,也许你可以选择实现它。@kbo - Jonathan JOhx
你的解决方案是否有可用的代码库? - Enrico Giurin
@EnricoGiurin 如果你复制并粘贴我在这里发布的内容,那么它应该可以工作。 - Jonathan JOhx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接