问题背景
这是一个困扰了我有一段时间,让我哭笑不得的一个问题,我现在在做的一个项目用的技术是SpringBoot + JPA + PostgreSQL。
PostgreSQL在安装完成后会有一个默认的模式public,数据的操作也都默认是public,但是因为业务上的划分,我们这边又新创建了一个模式,通过注解@Table(name = “”, schema = “”)进行区分。
但是,在查询的过程中,却报了一个非常奇怪的问题,org.postgresql.util.PSQLException: 错误: 关系 “” 不存在,可事实上模式是存在的,表也是存在的,但是却无法正常查询。
解决问题
后来猜想(猜想的过程真的复杂,自己也是在网上搜了好久都没有搜到答案,即使相关的文章也没有找到),会不会是数据库版本的问题,于是便装了几个不同的版本进行测试。
测试的数据库版本:9.5, 9.6, 10.12
数据库结构如下:
新建了两个模式sa和sb,两个模式下分别有一张表testa和testb。
代码结构如下:
Testa.java:
@Entity
@Table(name = "testa", schema = "sa")
public class Testa implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = -7768637914227571159L;
/**
* uuid
*/
@Id
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@Column(name = "id", nullable = false, length = 64)
private String id ;
@Column(name = "name", nullable = true, length = 50)
private String name ;
getter/setter......
}
Testb.java:
@Entity
@Table(name = "testb", schema = "sb")
public class Testb implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = -7768637914227571159L;
/**
* uuid
*/
@Id
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@Column(name = "id", nullable = false, length = 64)
private String id ;
@Column(name = "name", nullable = true, length = 50)
private String name ;
getter/setter......
}
TestController:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestaRepository testaRepository;
@Autowired
private TestbRepository testbRepository;
@GetMapping("/testa")
public List<Testa> testa() {
List<Testa> findAll = testaRepository.findAll();
return findAll;
}
@GetMapping("/testb")
public List<Testb> testb() {
List<Testb> findAll = testbRepository.findAll();
return findAll;
}
}
结论
经过测试,9.5和10.12版本的postgreSQL都无法正常的识别schema并查询表中的数据,
只有9.6版本的数据库可以正常的查询数据,目前猜测,是数据库版本的问题,但是有一点很是疑惑,为什么,10.12的版本比9.6高,也会出现这种问题?难道不仅仅数据库的原因,JPA的版本也会影响查询结果吗???