根据spring jpa中的实体从多个表中获取数据 [英] Get data from multiple tables based on entities in spring jpa

查看:84
本文介绍了根据spring jpa中的实体从多个表中获取数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有三个实体,如下所示:

I have three entities like below:

评论:

@Entity
@Table(name = "comments")
public class CommentBean implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "commentId")
    private long commentId;

    @Column(name = "topicId")
    private String topicId;
}

主题:

@Entity
@Table(name = "topics")
public class TopicBean implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "topicId")
    private String topicId;
    @Column(name = "title")
    private String title;
    @Column(name = "details")
    private String details;
    @Column(name = "username")
    private String username;
    @Column(name = "userImage")
    private String userImage;
    @Column(name = "dayPosted")
    private String dayPosted;
}

喜欢:

@Entity
@Table(name = "comment_likes")
public class CommentLikes implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "commentLikes")
    private String commentLikes;

    @Column(name = "commentId")
    private long commentId;
}

我想根据要求从三个表/实体获取所有数据:

I want to get all data from three tables/entities on request:

@RequestMapping(path = "/get_data_on_login", method = RequestMethod.GET)
public ResponseEntity get_data_on_login()) throws Exception {

}

我如何实现这一目标?我已经看过使用@query的示例和一些使用 searchByAnd ... 的示例,但更令人困惑的是要遵循哪种方法。

How do I achieve this? I have seen examples using @query and some examples using searchByAnd... but Its more confusing which approach to follow.

更新:

尝试使用@JoinColumn映射表以使用 bean.findAll()<来获取数据/ code>但是,我收到此错误:

Tried using @JoinColumn to map tables to get the data using bean.findAll() however, I am getting this error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1589) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:554) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) ~[spring-context-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) ~[spring-context-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.4.3.RELEASE.jar:1.4.3.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) [spring-boot-1.4.3.RELEASE.jar:1.4.3.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) [spring-boot-1.4.3.RELEASE.jar:1.4.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.4.3.RELEASE.jar:1.4.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) [spring-boot-1.4.3.RELEASE.jar:1.4.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) [spring-boot-1.4.3.RELEASE.jar:1.4.3.RELEASE]
    at seconds47.Application.main(Application.java:24) [classes/:?]
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1648) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1585) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    ... 16 more
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: seconds47.beans.CommentBean column: topicId (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:830) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:848) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:870) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:605) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.mapping.RootClass.validate(RootClass.java:265) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1648) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1585) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
    ... 16 more

更新代码:

主题Bean:

@Entity
@Table(name = "topics")
public class TopicBean implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "topicId")
    private String topicId;
    @Column(name = "title")
    private String title;
    @Column(name = "details")
    private String details;
    @Column(name = "username")
    private String username;
    @Column(name = "userImage")
    private String userImage;
    @Column(name = "dayPosted")
    private String dayPosted;

    @OneToMany(mappedBy="topicBean")
    private List<CommentBean> commentBeans;
}

commentBean:

commentBean:

@Entity
@Table(name = "comments")
public class CommentBean implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "commentId")
    private long commentId;

    @Column(name = "topicId")
    private String topicId;

    @Column(name = "comments")
    private String comments;

    @Column(name = "commentDate")
    private String commentDate;

    @Column(name = "userImage")
    private String userImage;

    @Column(name = "username")
    private String username;

    @ManyToOne
    @JoinColumn(name="topicId")
    private TopicBean topicBean;
}

存储库:

评论喜欢回购:

@Repository
public interface CommentLikeRepository extends JpaRepository<CommentLikes, Long>{

    CommentLikes findByCommentId(long commentId);
}

评论回复回购:

@Repository
public interface CommentReplyRepository extends JpaRepository<CommentReply, Long> {

    CommentReply findByReplyId(String replyId);

    @Transactional
    Long deleteByReplyId(String replyId);

}

评论回购:

@Repository
public interface CommentRepository extends JpaRepository<CommentBean, Long>{
    List<CommentBean> findByTopicId(String topicId);
    CommentBean findByCommentId(long commentId);

    @Transactional
    Long deleteByCommentId(long deleteId);
}

主题回购:

@Repository
public interface TopicRepository extends JpaRepository<TopicBean, Long> {
    TopicBean findByTopicId(String topicId);

    @Transactional
    Long deleteByTopicId(String topicId);

    List<TopicBean> findByUsername(String username);
}

用户信息回购:

@Repository
public interface UserInfoRepository extends JpaRepository<UserInfo, Long>{

    UserInfo findByUsername(String username);

    UserInfo findRoleByUsername(String username);
}


推荐答案

由于您的代码包含 spring-boot spring-jpa

我假设您可以使用弹簧数据存储库

Since your tags include spring-boot and spring-jpa.
I assume you can use spring data repositories

发布的实体不以任何方式关联。因此,必须关联实体才能使用一个存储库检索所有数据
实体的修改版本如下所示:

The entities posted are not associated in any way. Therefore, the entities must be associated in order to retrieve all the data with one repository The modified version of entities look like this:

注释表

@Entity
@Table(name = "comments")
public class CommentBean implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "commentId")
    private long commentId;

    @ManyToOne
    @JoinColumn(name="topicId")
    private TopicBean topicBean;

    @OneToMany(mappedBy="commentBean")
    private List<CommentLikes> commentLikesList;
}

主题表

@Entity
@Table(name = "topics")
public class TopicBean implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "topicId")
    private String topicId;
    @Column(name = "title")
    private String title;
    @Column(name = "details")
    private String details;
    @Column(name = "username")
    private String username;
    @Column(name = "userImage")
    private String userImage;
    @Column(name = "dayPosted")
    private String dayPosted;

    @OneToMany(mappedBy="topicBean")
    private List<CommentBean> commentBeans;
}

comment_likes table

comment_likes table

@Entity
@Table(name = "comment_likes")
public class CommentLikes implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "commentLikes")
    private String commentLikes;

    @ManyToOne
    @JoinColumn(name="commentId")
    private CommentBean commentBean;
}  

请注意,上述重写基于我可以做出的最明智的猜测到原始实体。

Note that the above rewrite is based on the most sensible guess I can make according to the original entities.

现在三个实体正确关联。
您可以使用TopicBean存储库来检索所有TopicBeans,另外两个也将被检索。

topicBeanRepo.findAll()

Now the three entities are properly associated. You can just use TopicBean repository to retrieve all the TopicBeans and the other two will be retrieved as well.
topicBeanRepo.findAll()

这篇关于根据spring jpa中的实体从多个表中获取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆