如果你想要联合,我猜这两个实体的结构是相似的。 您可以创建一个超级实体,并使User和UserGroup扩展这个新实体。如果您想保留两个单独的表,请在新实体上添加@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)。 然后,为父实体创建Spring Data JPA Repository。
/**
* new abstract Superclass
*/
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class User {
@Id
private String id;
//...
}
/**
* Existing User entity
*/
@Entity
@Table(name="my_users")
public class LoginUser extends User {
private String password;
@ManyToOne
private Group group;
//...
}
/**
* Existing Group entity
*/
@Entity
@Table(name="my_groups")
public class Group extends User {
private String name;
@OneToMany(mappedBy="group")
private Set<LoginUser> users;
//...
}
/**
* Super repository, providing UNION
*/
public interface UserRepository extends JpaRepository<User, String> {}
3条答案
按热度按时间fzsnzjdm1#
如果你想要联合,我猜这两个实体的结构是相似的。
您可以创建一个超级实体,并使User和UserGroup扩展这个新实体。如果您想保留两个单独的表,请在新实体上添加
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
。然后,为父实体创建Spring Data JPA Repository。
调用
UserRepository.findAll
将使JPA执行2个表的UNION
,并可以返回List<User>
。您将在此列表中同时拥有LoginUser
和Group
示例:有关JPA继承的更多详细信息,请参阅https://en.wikibooks.org/wiki/Java_Persistence/Inheritance。
JPA/Hibernate不支持自定义UNION查询,但是当使用
TABLE_PER_CLASS
策略时,继承在相同层次结构的实体之间提供了开箱即用的UNION。您不能使用JPA生成所需的查询。不可能联合不同的字段。但是如果您将email和titleMap到同一个字段(这是无稽之谈)并编写以下JPQL,JPA将生成您的查询。
km0tfn4u2#
所以我解决了我的问题,在数据库本身创建一个视图,然后将其Map到我的java实体,因为似乎hibernate不支持'union'查询
kwvwclae3#
你可以使用nativeQuery:
Spring文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query.native