带有弹簧数据jpa的并表

时间:2019-04-24 12:06:47

标签: java spring hibernate jpa spring-data-jpa

我有2个表,一个是Users,另一个是UserGroup具有ManyToMany关系,如何将它们结合到带有spring-data-JPA的单个List中。

**不想使用本机查询

更新

我想要的确切查询:

选择来自用户的电子邮件

UNION

从组中选择标题

2 个答案:

答案 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>。您将在此列表中同时拥有LoginUserGroup实例:

// 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实体的问题,因为似乎休眠状态不支持“联合”查询