我有2个表,一个是Users
,另一个是UserGroup
具有ManyToMany
关系,如何将它们结合到带有spring-data-JPA的单个List中。
**不想使用本机查询
更新:
我想要的确切查询:
选择来自用户的电子邮件
UNION
从组中选择标题
答案 0 :(得分:0)
如果要合并,我想这两个实体的结构是相似的。
您可以创建一个超级实体,并使User和UserGroup扩展此新实体。如果要保留2个单独的表,请在新实体上添加@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
。
然后,为父实体创建一个Spring Data JPA存储库。
/**
* 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> {}
调用UserRepository.findAll
将使JPA执行2个表中的UNION
,并可以返回List<User>
。您将在此列表中同时拥有LoginUser
和Group
实例:
// UNION query returning both LoginUser and Group instances
List<User> myUnion = userRepository.findAll();
有关JPA继承的详细信息,请参见https://en.wikibooks.org/wiki/Java_Persistence/Inheritance。
JPA / Hibernate不支持自定义UNION查询,但是在使用TABLE_PER_CLASS
策略时,继承在相同层次结构的实体之间提供了开箱即用的UNION。
您无法使用JPA生成所需的查询。无法在不同字段上建立UNION。但是,如果您将电子邮件和标题映射到同一个字段(这是废话)并编写以下JPQL,则JPA会生成您的查询。
SELECT u.yourField FROM User u;
答案 1 :(得分:0)
所以我解决了在数据库本身中创建视图以及将其映射到我的Java实体的问题,因为似乎休眠状态不支持“联合”查询