jpa建立视图与实体的映射

比眉伴天荒 2022-01-21 03:27 699阅读 0赞

其实和实际table 与实体建立映射方式一样

视图 user_view

比如:
我有以下视图:user_view
在这里插入图片描述由于其中几个数据是由其他表统计而来,为了减小代码编写难度,采用视图的方式

实体 UserInfoView

视图对应的实体UserInfoView.java
注意:如果表名与实体不一致,在映射时需要指定name 属性

  1. @Table(name = "user_view")
  2. @Entity
  3. public class UserInfoView {
  4. @Id
  5. private Integer id;
  6. @Column
  7. private String account;
  8. @Column
  9. private String nikeName;
  10. @Column
  11. private String photo;
  12. @Column
  13. private String about;
  14. @Column
  15. private String signature;
  16. @Column
  17. private Integer likeCount;
  18. @Column
  19. private Integer articleCount;
  20. @Column
  21. private Integer visitCount;
  22. @Column
  23. private Integer fansCount;
  24. public Integer getId() {
  25. return id;
  26. }
  27. public void setId(Integer id) {
  28. this.id = id;
  29. }
  30. public String getAccount() {
  31. return account;
  32. }
  33. public void setAccount(String account) {
  34. this.account = account;
  35. }
  36. public String getNikeName() {
  37. return nikeName;
  38. }
  39. public void setNikeName(String nikeName) {
  40. this.nikeName = nikeName;
  41. }
  42. public String getPhoto() {
  43. return photo;
  44. }
  45. public void setPhoto(String photo) {
  46. this.photo = photo;
  47. }
  48. public String getAbout() {
  49. return about;
  50. }
  51. public void setAbout(String about) {
  52. this.about = about;
  53. }
  54. public String getSignature() {
  55. return signature;
  56. }
  57. public void setSignature(String signature) {
  58. this.signature = signature;
  59. }
  60. public Integer getLikeCount() {
  61. return likeCount;
  62. }
  63. public void setLikeCount(Integer likeCount) {
  64. this.likeCount = likeCount;
  65. }
  66. public Integer getArticleCount() {
  67. return articleCount;
  68. }
  69. public void setArticleCount(Integer articleCount) {
  70. this.articleCount = articleCount;
  71. }
  72. public Integer getVisitCount() {
  73. return visitCount;
  74. }
  75. public void setVisitCount(Integer visitCount) {
  76. this.visitCount = visitCount;
  77. }
  78. public Integer getFansCount() {
  79. return fansCount;
  80. }
  81. public void setFansCount(Integer fansCount) {
  82. this.fansCount = fansCount;
  83. }
  84. }

dao 定义:

  1. public interface UserInfoViewDao extends CrudRepository<UserInfoView, Integer> {
  2. UserInfoView findByAccount(String account);
  3. }

测试:

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. @Slf4j
  4. public class BlogApplicationTests {
  5. @Autowired
  6. UserInfoViewDao userInfoViewDao;
  7. @Test
  8. public void testViewDao(){
  9. log.info("view:{}",userInfoViewDao.findByAccount("zhangsan"));
  10. }
  11. }

效果;

  1. Hibernate: select userinfovi0_.id as id1_12_, userinfovi0_.about as about2_12_, userinfovi0_.account as account3_12_, userinfovi0_.article_count as article_4_12_, userinfovi0_.fans_count as fans_cou5_12_, userinfovi0_.like_count as like_cou6_12_, userinfovi0_.nike_name as nike_nam7_12_, userinfovi0_.photo as photo8_12_, userinfovi0_.signature as signatur9_12_, userinfovi0_.visit_count as visit_c10_12_ from user_view userinfovi0_ where userinfovi0_.account=?
  2. 2019-06-07 22:40:48.860 INFO 14128 --- [ main] com.blog.demo.BlogApplicationTests : view:UserInfoView{id=14, account='zhangsan', nikeName='张三三', photo='太帅无法显示', about='string', signature='随便想一个签名', likeCount=2, articleCount=4, visitCount=3, fansCount=4}

jpa 其实就是hibernate ,但是实现了java 代码查询单表,复杂查询还是推荐使用原生sql
多表分页即需原生sql。
之前我就写过一篇博客记录了在hibernate 中使用了视图-实体映射,现在在jpa由于也是hibernate,那么应该是可以的。

在实现的过程中遇到一个问题:
擅自更改了数据库一个字段名,同时也将实体中的字段属性也作出了相应更改,但是没有改
get,set 方法,导致报错:

javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister

错误来看是没能创建sesstionfactory,不能找到实体的构造函数额,这个构造可能看的有点疑惑,默认都是有无参构造的,谁能想到是 getXXX方法与属性名不一致导致的

  1. @Column
  2. public String getSingnature() { // 应该写成getSignature
  3. return signature;
  4. }

发表评论

表情:
评论列表 (有 0 条评论,699人围观)

还没有评论,来说两句吧...

相关阅读

    相关 建立视图

    视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,数据仍在基本表中。一旦基本表中的数据发生变化,从视图查