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、用户名信息验证。验证实体与表的映射一致性
- 检查表名大小写:部分数据库(如PostgreSQL)对表名大小写敏感,实体
@Table注解的TOURNAMENT_需与数据库实际表名完全一致(包括大小写)。 - 核对字段映射:确认数据库表中
ID、IS_FINISHED字段的名称、类型是否与实体定义匹配,比如IS_FINISHED是否为布尔类型且非空。 - 检查实体扫描:确保
Tournament_所在包被Jmix组件扫描覆盖,未被排除在扫描范围外。
- 检查表名大小写:部分数据库(如PostgreSQL)对表名大小写敏感,实体
查看实际执行的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
相关产品推荐
相关产品推荐

