首页 > 解决方案 > 休眠和查询视图。结果计数正常,但所有行都相同,但它们不在数据库中

问题描述

我有一个代表(mysql)数据库视图的实体:

@Entity
@Immutable
@Table(name = "user_info_view")
public class UserInfoView implements Serializable {

    @Id
    @Column(name = "user_uuid")
    private String userUUID;

    @Column(name = "name")
    private String name;

    @Column(name = "address")
    private String address;

    //getters, setters, constructors...

    }

该视图是使用简单的 SQL 创建的,例如:

CREATE OR REPLACE VIEW USER_INFO_VIEW
AS
    SELECT u.USER_UUID,
           u.NAME,
           a.ADDRESS
    FROM
    USER u
    JOIN
    ADDRESS a
    ON a.ID = u.ADDRESS_ID

和一个存储库:

@Repository
public interface UserInfoViewRepository extends JpaRepository<UserInfoView, String> {

    List<UserInfoView> findAllByUserUUID(String userUUID);
    
}

SELECT * FROM USER_INFO_VIEW正在返回 4 行。运行findAllByUserUUID()方法返回一个包含 4 个UserInfoView对象的列表,但它们都是相同的 - 它们包含数据库第一行的数据。

以下是对数据库的查询结果:

从用户中选择 *:

id | user_uuid | name | address_id |
------------------------------------
1  | UUID1     | john | 1          |
2  | UUID1     | jane | 2          |
3  | UUID1     | josh | 3          |
4  | UUID1     | mark | 4          |
------------------------------------ 

SELECT * FROM ADDRESS:

id | address            | name  | is_current |
----------------------------------------------
1  | some address 1     | addr1 | 1          |
2  | some address 2     | addr2 | 0          |
3  | some address 3     | addr3 | 1          |
4  | some address 4     | addr4 | 1          |
---------------------------------------------- 

SELECT * FROM USER_VIEW WHERE USER_UUID = "UUID1":

user_uuid | name | address            |
---------------------------------------
UUID1     | john | some address 1     |
UUID1     | jane | some address 2     |
UUID1     | josh | some address 3     |
UUID1     | mark | some address 4     |
---------------------------------------

什么可能导致这种行为?

标签: javamysqlspring-boothibernatejpa

解决方案


user_uuid列不是唯一的事实会导致重复,因为它被标记为 @Id 并且 JPA 使用它的值来查找实体。您将需要使用包含识别属性的 an或 an的复合 PK 。IdClassEmbeddedId


推荐阅读