我有如下三个实体:
评论:
@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;
}
我想根据请求获取三个表/实体的所有数据:
@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
更新代码:
主题 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;
}
评论Bean:
@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;
}
存储库:
评论喜欢 repo :
@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。
我假设你可以使用 spring 数据存储库
发布的实体不以任何方式关联。因此,必须关联实体才能检索一个存储库的所有数据 实体的修改版本如下所示:
评论表
@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;
}
请注意,上述重写是基于我根据原始实体所能做出的最合理的猜测。
现在这三个实体已正确关联。
您可以只使用 TopicBean 存储库来检索所有 TopicBean,另外两个也将被检索。
topicBeanRepo.findAll()
关于java - spring jpa中根据实体从多个表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42037275/