与 spring data jpa 联合表

meh*_*ani 3 java spring hibernate jpa spring-data-jpa

我有 2 个表,一个是Users,另一个是UserGroupManyToMany关系 ,如何使用 spring-data-JPA 将它们合并到一个列表中。

** 不想使用本机查询

更新

我需要的确切查询:

从用户中选择电子邮件

联盟

从组中选择标题

Pat*_*die 7

如果你想要联合,我想这两个实体的结构是相似的。

您可以创建一个超级实体并让 User 和 UserGroup 扩展这个新实体。@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)如果您想保留 2 个单独的表,请添加新实体。

然后,为父实体创建一个 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> {}
Run Code Online (Sandbox Code Playgroud)

调用UserRepository.findAll将使 JPA 执行UNION2 个表的操作,并且可以返回List<User>. 您将在此列表中同时拥有LoginUserGroup实例:

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

有关 JPA 继承的更多详细信息,请参阅https://en.wikibooks.org/wiki/Java_Persistence/Inheritance 。

JPA/Hibernate 不支持自定义 UNION 查询,但继承在使用策略时在同一层次结构的实体之间提供开箱即用的 UNION TABLE_PER_CLASS

您无法使用 JPA 生成您想要的查询。无法合并不同的字段。但是,如果您将电子邮件和标题映射到同一字段(这是无意义的)并编写以下 JPQL,JPA 将生成您的查询。

 SELECT u.yourField FROM User u;
Run Code Online (Sandbox Code Playgroud)