2017-02-04 2 views
2

J'ai trois entités comme ci-dessous:Obtenir des données de plusieurs tables basées sur des entités au printemps JPA

Commentaires:

@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; 
} 

Sujets:

@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; 
} 

Appréciations:

@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; 
} 

Je veux obtenir toutes les données de t trois tables/entités sur demande:

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

} 

Comment réaliser ceci? J'ai vu des exemples en utilisant @query et quelques exemples en utilisant searchByAnd... mais c'est plus déroutant quelle approche à suivre.

Mise à jour:

essayé d'utiliser @JoinColumn pour cartographier les tables pour obtenir les données à l'aide bean.findAll() cependant, je reçois cette erreur:

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 

Code de mise à jour:

Sujet 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:

@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; 
} 

: Référentiels

commentaire Aime Repo:

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

    CommentLikes findByCommentId(long commentId); 
} 

commentaire réponse Repo:

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

    CommentReply findByReplyId(String replyId); 

    @Transactional 
    Long deleteByReplyId(String replyId); 

} 

commentaire Repo:

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

    @Transactional 
    Long deleteByCommentId(long deleteId); 
} 

Sujet Repo:

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

    @Transactional 
    Long deleteByTopicId(String topicId); 

    List<TopicBean> findByUsername(String username); 
} 

Infos utilisateurs repo:

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

    UserInfo findByUsername(String username); 

    UserInfo findRoleByUsername(String username); 
} 

Répondre

3

Étant donné que vos balises comprennent printemps-démarrage et ressort JPA.
Je suppose que vous pouvez utiliser référentiels de données de printemps

Les entités affichées ne sont pas associés d'aucune façon.Par conséquent, les entités doivent être associées afin de récupérer toutes les données avec un référentiel La version modifiée des entités se présentent comme suit:

commentaires Table

@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; 
} 
table sujets

@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

@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; 
} 

Notez que t La réécriture ci-dessus est basée sur l'estimation la plus sensée que je puisse faire selon les entités d'origine.

Maintenant, les trois entités sont correctement associées. Vous pouvez simplement utiliser le référentiel TopicBean pour récupérer tous les TopicBeans et les deux autres seront également récupérés.
topicBeanRepo.findAll()

+0

Pas clair ....... – kittu

+0

Ceci est seulement une solution possible. Votre question ne dit pas qu'un seul référentiel est désiré et il n'y a pas de référentiel de votre dépôt, donc je suppose que vous avez besoin d'un exemple de travail. À partir des tables que vous avez publiées, il n'y a aucun moyen de le faire avec un seul référentiel, car les tables ne sont en aucun cas associées. –

+0

Je peux vous aider à restructurer vos tables/entités, mais veuillez reformuler ou mettre à jour votre question. –