微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CrudRepository 返回错误的结果集

如何解决CrudRepository 返回错误的结果集

我在使用 Hibernate 和 CrudRepository 时遇到问题。

我有一个控制器,它返回一组由视图获取的结果。 我创建了一个视图,因为我认为这是管理我的数据库实体的最佳方式,它们是这样创建的:

CREATE TABLE Characters (
  CHaraCTER_ID INT,CHaraCTER_NAME VARCHAR(50) NOT NULL,CHaraCTER_ICON VARCHAR(250) NOT NULL,gender VARCHAR(10) NOT NULL,status VARCHAR(15) NOT NULL,clevel INT NOT NULL,experience INT NOT NULL,TOTAL_EXPERIENCE INT NOT NULL,health INT NOT NULL,HEALTH_STATUS VARCHAR(20) NOT NULL,role VARCHAR(20) NOT NULL,PRIMARY KEY (CHaraCTER_ID)
);

CREATE TABLE GUILDROLE (
ROLE_ID INT NOT NULL,GUILD_ID INT NOT NULL,NAME VARCHAR(50) NOT NULL,SALARY INT NOT NULL,MANAGER BIT NOT NULL,ROLE_IMG VARCHAR(250),DESCRIPTION VARCHAR(800),GUILD_LEVEL INT NOT NULL,PRIMARY KEY (ROLE_ID,GUILD_ID)
);

CREATE TABLE GUILDMEMBER (
CHaraCTER_ID INT NOT NULL,ROLE_ID INT NOT NULL,PRIMARY KEY(CHaraCTER_ID,ROLE_ID)
);

CREATE VIEW V_GUILDMEMBERS
AS
SELECT
 GR.GUILD_ID AS GUILD_ID,GR.ROLE_ID AS ROLE_ID,CH.CHaraCTER_ID AS CHaraCTER_ID,CH.CHaraCTER_NAME AS CHaraCTER_NAME,GR.GUILD_LEVEL AS GUILD_LEVEL,GR.NAME AS ROLE_NAME,GR.ROLE_IMG AS ROLE_IMG
FROM GUILDMEMBER GM
 JOIN GUILDROLE GR
ON GM.ROLE_ID = GR.ROLE_ID
 JOIN CHaraCTERS AS CH
ON CH.CHaraCTER_ID = GM.CHaraCTER_ID;

我已经实现了像这样对视图建模的类:

import lombok.Data;
import org.hibernate.annotations.Immutable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Immutable
@Data
public class V_GuildMembers {

    @Id
    @Column(name = "GUILD_ID")
    private Integer guildId;

    @Column(name = "ROLE_ID")
    private Integer roleId;

    @Column(name = "CHaraCTER_ID")
    private Integer characterId;

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

    @Column(name = "GUILD_LEVEL")
    private Integer guildLevel;

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

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

}

我的 RepositoryService 看起来像这样:

public List<V_GuildMembers> getGuildMembers(Integer guildId){
        List<V_GuildMembers> members = new ArrayList<>();
        if(guildId != null){
            members = guildMemberListRepository.findMembersByGuildId(guildId);
        }
        return members;
    }

最后,我的存储库界面是这样的:

import com.novavrbe.vrbe.dto.V_GuildMembers;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.CrudRepository;

import java.util.List;
import java.util.Optional;

public interface GuildMemberListRepository extends CrudRepository<V_GuildMembers,Integer>,JpaSpecificationExecutor<V_GuildMembers> {

    default List<V_GuildMembers> findMembersByGuildId(Integer guildId) {
        return findAll(
                (root,query,criteriaBuilder)-> criteriaBuilder.equal(root.get("guildId"),guildId)
        );

    }

    default Optional<V_GuildMembers> getGuildMemberbyID(Integer characterid){

        return findOne(((root,criteriaQuery,criteriaBuilder) -> criteriaBuilder.equal(root.get("characterId"),characterid)));

    }
}

在不使用 CrudRepository 和在 sql Manager 或 MysqL Workbench 上使用普通 Select 的情况下,一切都可以完美运行。 我在同一个 Giuld 中添加了 3 个公会成员,名称和角色不同,但我从控制器和方法 findMembersByGuildId(guildId) 获得的结果集如下:

"members": [
        {
            "role_ID": 5,"character_ID": 1,"guild_LEVEL": 50,"guild_ID": 1,"role_IMG": "","character_NAME": "Marzio Paparzio","role_NAME": "Legatus"
        },{
            "role_ID": 5,"role_NAME": "Legatus"
        }
    ]

事实上,结果似乎复制了结果的确切时间记录之一。 希望有人能帮帮我!

提前致谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。