Собственный запрос Spring Data JPA с предложением WHERE возвращает пустой список, несмотря на то, что записи существуют JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Собственный запрос Spring Data JPA с предложением WHERE возвращает пустой список, несмотря на то, что записи существуют

Сообщение Anonymous »

Я столкнулся со странной проблемой, когда собственный запрос в Spring Data JPA возвращает пустой список [] или 0 результатов, хотя тот же SQL-запрос возвращает записи при выполнении непосредственно в базе данных.
Проблема

Код: Выделить всё


// This returns empty list []
List allByFuelRecordId = dgReadingService.findAllByFuelRecordId(785L);
System.out.println("The size: "+allByFuelRecordId.size()); //prints nothing, coz the empty exception is called in the `findAllByFuelRecordId` method

// This returns all 777 records
List allByFuelRecordId2 = dgReadingService.findAll();
System.out.println("The size 2: "+allByFuelRecordId2.size()); // Prints 777
Структура кода
Уровень репозитория

Код: Выделить всё

@Query(value = "SELECT * FROM ritam_site_fuel_dg_reading where fuel_record_id = :fuelRecordId", nativeQuery = true)
List findAllByFuelRecordId(Long fuelRecordId);

@Query(value = "SELECT * FROM ritam_site_fuel_dg_reading ", nativeQuery = true)
List findAllRecs();
Сервисный уровень

Код: Выделить всё

public List findAll() {
List list = dgReadingRepo.findAllRecs();
if(list.size() > 0){
return list;
} else {
throw new CustomErrorException(HttpStatus.NOT_FOUND, "Previous DG details for record missing - ");
}
}

public List findAllByFuelRecordId(Long fuelRecordId) {
List list = dgReadingRepo.findAllByFuelRecordId(fuelRecordId);
if(list.size() > 0){
return list;
} else {
throw new CustomErrorException(HttpStatus.NOT_FOUND, "Previous DG details for record missing - " + fuelRecordId);
}
}
Сопоставление объектов

Код: Выделить всё

@Entity
@Table(name = "ritam_site_fuel_dg_reading")
public class DgReading {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@JsonIgnore
@ToString.Exclude
@NotNull(message = "Fuel record is required")
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "fuel_record_id", nullable = false)
private FuelRecord fuelRecord;

// other fields...
}
Сведения о базе данных
  • Тип столбца: Fuel_record_id имеет значение BIGINT в базе данных MySQL
  • Данные существуют: значение 785 существует и имеет две записи с этим Fuel_record_id
  • Возраст записи: записи были сохранены два дня назад (так что это не проблема с транзакцией/очисткой)
Что работает
Прямой SQL-запрос в клиенте базы данных возвращает 2 записи:

Код: Выделить всё

SELECT * FROM ritam_site_fuel_dg_reading WHERE fuel_record_id = 785;
Что я пробовал (ничего не помогло)
1. Добавлена ​​аннотация @Param

Код: Выделить всё

@Query(value = "SELECT * FROM ritam_site_fuel_dg_reading where fuel_record_id = :fuelRecordId", nativeQuery = true)
List findAllByFuelRecordId(@Param("fuelRecordId") Long fuelRecordId);
2. Вместо собственного запроса использовался JPQL

Код: Выделить всё

@Query("SELECT d FROM DgReading d WHERE d.fuelRecord.fuelRecordId = :fuelRecordId")
List findAllByFuelRecordId(@Param("fuelRecordId") Long fuelRecordId);
3. Добавлен очистка/очистка объектного менеджера

Код: Выделить всё

entityManager.flush();
entityManager.clear();
4. Добавлено прямое сопоставление полей

Код: Выделить всё

@Column(name = "fuel_record_id", insertable = false, updatable = false)
private Long fuelRecordIdDirect;
5. Использовал EntityManager напрямую

Код: Выделить всё

@Autowired
private EntityManager entityManager;

public List debugFindByFuelRecordId(Long fuelRecordId) {
String sql = "SELECT * FROM ritam_site_fuel_dg_reading WHERE fuel_record_id = ?";
Query query = entityManager.createNativeQuery(sql, DgReading.class);
query.setParameter(1, fuelRecordId);
return query.getResultList();
}
6. Пробовал разные типы параметров

Код: Выделить всё

// As String
query.setParameter(1, "785");

// As Integer
query.setParameter(1, 785);
7. Проверено COUNT

Код: Выделить всё

String countSql = "SELECT COUNT(*) FROM ritam_site_fuel_dg_reading WHERE fuel_record_id = ?";
Query countQuery = entityManager.createNativeQuery(countSql);
countQuery.setParameter(1, 785L);
Long count = ((Number) countQuery.getSingleResult()).longValue(); // Also returns 0
Среда
  • Spring Boot: 2.x.x
  • Spring Data JPA: 2.x.x
  • База данных: MySQL 8.x
  • Java: 17.11
Вопрос
Почему собственный запрос с предложением WHERE возвращает 0 результатов, когда тот же SQL работает непосредственно в базе данных? Что может быть причиной этого несоответствия и как это исправить?
Метод findAll() работает отлично и возвращает все 777 записей, но любая фильтрация запроса по Fuel_record_id возвращает 0 результатов, даже если столбец существует и содержит искомые значения.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ite-record
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»