CrudRepository existBy возвращает неверный результат - PullRequest
0 голосов
/ 02 октября 2018

Я столкнулся со следующей проблемой: 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 для данных, которых нет вDB.

Например, я передаю 'asdf' как textCode и 0 как organizationId.И я получаю true, несмотря на то, что такого нет textCode в БД.Вот автоматически сгенерированный код запроса:

    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

1 Ответ

0 голосов
/ 02 октября 2018

Глубокая отладка показала мне, что проблема заключается в последовательности вызовов методов в соответствующем сервисе.Главное, что existsBy возвращает результаты с учетом созданных сущностей, которых нет в БД на момент вызова existsBy.Итак, за несколько шагов до моей проблемы была создана сущность Attribute.Это означает, что Attribute было создано в текущей транзакции и еще не было сохранено, но existsBy уже приняло его как часть набора результатов.

Спасибо всем!

...