2017-02-04 124 views
2

我有三個實體,如下面從多個表中的數據:獲取基於實體春天JPA

評論:

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

我想從t中獲取所有數據hree桌/實體要求:

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

} 

我該如何做到這一點?我看過使用@query的示例和一些使用searchByAnd...的示例,但它更容易混淆後面的方法。

更新:

使用@JoinColumn映射表使用bean.findAll()然而得到的數據試過,我收到此錯誤:

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 

更新代碼:

主題豆:

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

庫:

評論喜歡的回購:

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

回答

3

由於您的代碼包含春季啓動彈簧JPA
我想你可以使用春數據倉庫

貼不以任何方式相關聯的實體。因此,實體必須以同一個倉庫 實體的修改後的版本檢索的所有數據相關聯是這樣的:

意見表

@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表

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

請注意,t他上面的改寫是基於我可以根據原始實體做出的最明智的猜測。

現在三個實體正確關聯。 您可以使用TopicBean存儲庫檢索所有TopicBeans,其他兩個也將被檢索。
topicBeanRepo.findAll()

+0

不清楚....... – kittu

+0

這只是一種可能的解決方案。你的問題並沒有說只有一個存儲庫是需要的,並且沒有發佈你的存儲庫,所以我想你需要一個工作的例子。從你發佈的表中,沒有辦法只用一個存儲庫來完成,因爲這些表沒有任何關聯。 –

+0

我可以幫助您重組您的表格/實體,但請更改或更新您的問題。 –