【问题标题】:CrudRepository existsBy returns a wrong resultCrudRepository existsBy 返回错误结果
【发布时间】:2019-03-07 09:39:25
【问题描述】:

我遇到了以下问题:CrudRepository 返回与数据库数据不匹配的错误结果。 有一个实体类:

@Entity
@Table(name = "ATTRIBUTE")
public class Attribute implements Serializable {

  private static final long serialVersionUID = 7360594743377794716L;
  *******

  @Id
  @Basic(optional = false)
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "ID")
  private Long id;  
  *******
  @Column(name = "R_ORGANIZATION_ID")
  private Long refOrganizationId;  
  @Column(name = "TEXT_CODE")
  private String textCode;
  *******
  /**
  getters, settrs, hashCode, etc
  **/
}

我有一个合适的CrudRepository

public interface AttributeRepository
    extends CrudRepository<Attribute, Long> {
  *****

  boolean existsByTextCodeAndRefOrganizationId(String textCode, Long organizationId);

  *****
}

问题是存储库为不在数据库中的数据返回true

例如,我将 'asdf' 作为 textCode 传递,将 0 作为 organizationId 传递。尽管数据库中没有这样的textCode,但我得到了true。 这是查询的自动生成代码:

    select
        TOP(?) attribute0_.id as col_0_0_ 
    from
        attribute attribute0_ 
    where
        attribute0_.text_code=? 
        and attribute0_.r_organization_id=?
12:00:24.805 [http-nio-8080-exec-6] TRACE o.h.t.d.s.BasicBinder - binding parameter [2] as [VARCHAR] - [asdf]
12:00:24.805 [http-nio-8080-exec-6] TRACE o.h.t.d.s.BasicBinder - binding parameter [3] as [BIGINT] - [0]

但如果我在任何 SQL 管理器中运行查询,我将得到 0 行。会是什么?

资料:MS SQL Server 2012, Java 1.8, spring-boot.version 1.5.4.RELEASE

【问题讨论】:

  • 也许记录是在事务中创建的,然后修改删除?
  • @talex 没有任何创建/更新操作。只选择。
  • 尝试用get... 替换exists... 并记录结果。它可能会为您提供有关它找到哪些数据的线索。

标签: java sql-server spring-data-jpa spring-data


【解决方案1】:

深度调试向我表明,问题出在相应服务中方法的调用顺序上。主要的是existsBy 返回的结果考虑到在existsBy 调用时不在数据库中的帐户创建的实体。因此,在我的问题之前的某些步骤中,Attribute 实体已创建。这意味着 Attribute 已在当前事务中创建,尚未持久化,但 existsBy 已将其作为结果集的一部分。

谢谢大家!

【讨论】:

  • 检查事务隔离级别。
猜你喜欢
  • 2020-02-12
  • 2018-06-02
  • 2021-05-05
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多