使用Spring Data JPA合并表格

3
我有两个表,一个是Users,另一个是UserGroup,它们之间具有ManyToMany关系。如何使用spring-data-JPA将它们合并成一个单独的列表,但不想使用本地查询。

更新:

我想要的确切查询语句:

SELECT email FROM user

UNION

SELECT title FROM group


我不太明白你的问题,你是想在JPA查询中连接这些表(而且已经有实体了),还是想知道如何将它们映射到一个实体中? - vc73
@vc73,我不想加入它们,我只想要这些表的“UNION”查询结果。 - mehran qorbani
1
它们是两个完全不同的东西。你为什么想要这样做呢? - Alan Hay
@AlanHay 想象一下,结果将被用作用户列表或用户组的形式,可以选择接收电子邮件或类似的内容。 - mehran qorbani
将其作为本地查询。它会起作用。 - Akhil Surapuram
3个回答

6
如果您想进行联合,我猜这两个实体的结构相似。您可以创建一个超级实体并使用户(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> 列表。您将在此列表中获得 LoginUserGroup 实例:

// UNION query returning both LoginUser and Group instances
List<User> myUnion = userRepository.findAll();

请参阅https://en.wikibooks.org/wiki/Java_Persistence/Inheritance以获取有关JPA继承的更多详细信息。
JPA / Hibernate不支持自定义UNION查询,但是当使用策略时,继承提供了同一层次结构实体之间的开箱即用的UNION功能。
您无法使用JPA生成所需的查询。无法将不同的字段进行UNION。但是,如果将电子邮件和标题映射到相同的字段(这是无意义的)并编写以下JPQL,则JPA将生成您的查询。
 SELECT u.yourField FROM User u;

实际上,表格在联合操作中不需要有注释。我更新了问题并添加了我想要的查询。 - mehran qorbani

3

我通过在数据库中创建视图并将其映射到我的Java实体来解决了问题,因为似乎Hibernate不支持“union”查询。


6
可以请你详细说明一下吗?你是如何完成这个任务的?这个视图是什么样子的? - JavaGeek

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接