使用spring数据jpa的联合表

2j4z5cfb  于 2023-09-29  发布在  Spring
关注(0)|答案(3)|浏览(87)

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

**不想使用本地查询
更新

我需要的确切查询:
从用户选择电子邮件
联盟
SELECT title FROM组

fzsnzjdm

fzsnzjdm1#

如果你想要联合,我猜这两个实体的结构是相似的。
您可以创建一个超级实体,并使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> {}

调用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生成所需的查询。不可能联合不同的字段。但是如果您将email和titleMap到同一个字段(这是无稽之谈)并编写以下JPQL,JPA将生成您的查询。

SELECT u.yourField FROM User u;
km0tfn4u

km0tfn4u2#

所以我解决了我的问题,在数据库本身创建一个视图,然后将其Map到我的java实体,因为似乎hibernate不支持'union'查询

kwvwclae

kwvwclae3#

你可以使用nativeQuery:

@Query("select u.email from user u union select g.title from group", nativeQuery = true)
public String findResult();

Spring文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query.native

相关问题