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

时间:2019-10-29 20:32:19

标签: spring-boot spring-data-jpa

我有几个xlapp = win32com.client.DispatchEx("Excel.Application") wb = xlapp.Workbooks.Open(<path_to_excel_workbook>) wb.RefreshAll() xlapp.CalculateUntilAsyncQueriesDone() xlapp.DisplayAlerts = False wb.Save() xlapp.Quit() 文件,这些文件用于不同的配置文件,并且每个文件都包含一个属性,每个属性都具有特定的值。我想在查询数据库中使用此属性作为参数。

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

例如application-x.properties

application.properties

可能的用法:

query.parameters.role: ADMIN

1 个答案:

答案 0 :(得分:5)

您可以通过以下方式实现:

1。-使用Repository Query Keywords

按角色查找所有用户
@Repository
public interface UserRepository extends JpaRepository<User, UUID> {

    Set<User> findByRole(String role);
}

2.-在getAllUsers中创建一个名为UserService的方法,并使用@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,您可以查看一下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();