我有一个带有一个实体和一个与此实体相关联的存储库的Spring Boot项目。在存储库中,有一个带有自定义查询的方法,在项目控制器中,该存储库用于从不同的postgresql数据库返回数据。这些数据库具有具有相同列的相同表(因此,所引用的实体相同),这些数据库之间的唯一区别是年份(…,DB2015,DB2016,DB2017)。我的问题是:如何在项目控制器中返回属于“不同”数据库的数据?是否可以使用同一查询从最初的第一个数据库中选择数据,然后从第二个数据库中选择数据,依此类推?在其他问题中,我读到我需要不同的数据源,这是正确的吗?
这是实体:
@Entity(name = "REQUEST") public class Request implements Serializable { /** * */ private static final long serialVersionUID = 1L; @Id @Column(name="IDREQUEST", nullable=false) private BigDecimal idrequest; @Column(name="PAYLOAD") private String payload; @Column(name="MITTENTE") private String mittente; @Column(name="SERVIZIO") private String servizio; @Column(name="DATARICEZIONE") private BigDecimal dataricezione; public BigDecimal getIdrequest() { return idrequest; } public void setIdrequest(BigDecimal idrequest) { this.idrequest = idrequest; } public String getPayload() { return payload; } public void setPayload(String payload) { this.payload = payload; } public String getMittente() { return mittente; } public void setMittente(String mittente) { this.mittente = mittente; } public String getServizio() { return servizio; } public void setServizio(String servizio) { this.servizio = servizio; } public BigDecimal getDataricezione() { return dataricezione; } public void setDataricezione(BigDecimal dataricezione) { this.dataricezione = dataricezione; } }
这是存储库:
@Repository public interface RequestRepository extends PagingAndSortingRepository<Request, BigDecimal> { @Query(nativeQuery=true, value="SELECT * FROM \"REQUEST\" WHERE strpos(\"PAYLOAD\",\'?1\') > 0") List<Request> findByCodiceFiscale(String codiceFiscale); }
这是控制器
@RequestMapping(value="/ricercaadesioni/{codicefiscale}", method=RequestMethod.GET) public ResponseEntity<List<Request>> ricercaAdesioniByCodiceFIscale(@PathVariable("codicefiscale") String codicefiscale) { List<Request> listAdesioni = requestRepo.findByCodiceFiscale(codicefiscale); return new ResponseEntity<List<Request>>(listAdesioni, HttpStatus.OK); }
这是application.properties(在这种情况下,数据源仅引用一个db):
spring.datasource.url=jdbc:postgresql://localhost:5432/DB2017_test spring.datasource.username=xxx spring.datasource.password=xxx
希望一切都清楚
使用不同的数据源创建2个配置文件,这2个配置文件将针对2个不同的jpa存储库类具有不同的规范。但是可以具有相同的域类。
在您的属性文件中,有2个数据源详细信息。
spring.datasource.url=jdbc:postgresql://localhost:5432/DB2017_test spring.datasource.username=xxx spring.datasource.password=xxx # DB2018 DB - "" spring.datasource2.url=jdbc:postgresql://localhost:5432/DB2018_test spring.datasource2.username=xxx spring.datasource2.password=xxx
step2>然后为第一个数据源创建配置文件
package com.package1; @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactory", basePackages = { "com.package1.repo" } ) public class DB2017Config { @Primary @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "entityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource ) { return builder .dataSource(dataSource) .packages("com.domain") .persistenceUnit("foo") .build(); } @Primary @Bean(name = "transactionManager") public PlatformTransactionManager transactionManager( @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory ) { return new JpaTransactionManager(entityManagerFactory); } }
step3>类似地为其他dataSource创建另一个配置文件,
@EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactory", basePackages = { "com.package2.repo" }
并更改前缀
@ConfigurationProperties(prefix = "spring.datasource2")
现在,如上所述,在package1和package2中分别将有两个类似的RequestRepository1和RequestRepository2(basePackages = {“ com.package1.repo”})。
step4>全部设置autowire 2不同的仓库。
@Autowired private final RequestRepository1 repo1; @Autowired private final RequestRepository2 repo2;
然后使用它们。
List<Request> listAdesioni = repo1.findByCodiceFiscale(codicefiscale); List<Request> listAdesioni = repo2.findByCodiceFiscale(codicefiscale);