You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JmixDataRepository无法查询到数据库中已存在的实体求助

JmixDataRepository 无法查询到数据库已存在实体的排查方案

问题场景

使用JmixDataRepository操作Tournament_实体时,调用count()返回0,但数据库中确实存在对应记录。相关代码如下:

仓库代码

public interface TournamentRepository extends JmixDataRepository<Tournament_, Long> {
    Optional<Tournament_> findBySlug(String slug);
}

实体代码

@JmixEntity
@Table(name = "TOURNAMENT_", indexes = {
        @Index(name = "IDX_TOURNAMENT__AUTHOR", columnList = "AUTHOR_ID"),
        @Index(name = "IDX_TOURNAMENT__SCORING_METHOD", columnList = "SCORING_METHOD_ID"),
        @Index(name = "IDX_TOURNAMENT_SCORINGTEMPLATE", columnList = "SCORING_TEMPLATE_ID"),
        @Index(name = "IDX_TOURNAMENT__ON_ROOM", columnList = "ROOM_ID", unique = true)
})
@Entity
public class Tournament_ {
    
    @Column(name = "ID", nullable = false)
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "IS_FINISHED", nullable = false)
    @NotNull
    private Boolean isFinished = false;
}

服务层调用代码

public Page<Tournament_> getPage(Integer page, Integer size) {
    System.out.println("Entities found: " + tournamentRepository.count());
    return tournamentRepository.findAll(PageRequest.of(page, size));
}

调试打印结果:

// Entities found: 0

排查方向

  • 确认数据源匹配
    检查应用配置的数据源是否指向你正在查看的数据库。多环境配置(dev/test/prod)容易导致连接错库,可通过日志搜索DataSource关键字,或在代码中打印数据源的URL、用户名信息验证。

  • 验证实体与表的映射一致性

    1. 检查表名大小写:部分数据库(如PostgreSQL)对表名大小写敏感,实体@Table注解的TOURNAMENT_需与数据库实际表名完全一致(包括大小写)。
    2. 核对字段映射:确认数据库表中ID、IS_FINISHED字段的名称、类型是否与实体定义匹配,比如IS_FINISHED是否为布尔类型且非空。
    3. 检查实体扫描:确保Tournament_所在包被Jmix组件扫描覆盖,未被排除在扫描范围外。
  • 查看实际执行的SQL语句
    开启JPA SQL日志,查看count()生成的真实SQL,直接在数据库客户端执行该SQL验证结果:
    在application.properties中添加:

    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
    

    通过日志获取SQL后,手动执行即可判断是SQL生成问题还是数据不匹配。

  • 检查事务上下文
    给服务层getPage方法添加@Transactional注解,强制开启事务后再执行查询。无事务上下文时,EntityManager可能无法正确读取数据库最新数据,或存在缓存不一致问题。

  • 排查Jmix数据过滤规则
    Jmix默认启用数据访问控制,检查是否有针对Tournament_的过滤规则(如角色权限、实体数据过滤条件)自动添加了过滤逻辑。可临时用无约束查询验证:

    tournamentRepository.unconstrained().count()
    

    若此时返回正确数量,说明是数据过滤规则导致的问题。

  • 检查逻辑删除字段
    若Tournament_继承了Jmix的BaseEntity,会自带deleteTs逻辑删除字段。检查数据库表中DELETE_TS字段是否为null,若记录被标记为逻辑删除,Jmix会自动过滤掉这些数据。


内容的提问来源于stack exchange,提问作者Olzhas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:01:05