Проблема
Код: Выделить всё
// This returns 0
List allByFuelRecordId = dgReadingService.findAllByFuelRecordId(785L);
System.out.println("The size: "+allByFuelRecordId.size()); // Prints 0
// 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);
Код: Выделить всё
@Query("SELECT d FROM DgReading d WHERE d.fuelRecord.fuelRecordId = :fuelRecordId")
List findAllByFuelRecordId(@Param("fuelRecordId") Long fuelRecordId);
Код: Выделить всё
entityManager.flush();
entityManager.clear();
Код: Выделить всё
@Column(name = "fuel_record_id", insertable = false, updatable = false)
private Long fuelRecordIdDirect;
Код: Выделить всё
@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();
}
Код: Выделить всё
// As String
query.setParameter(1, "785");
// As Integer
query.setParameter(1, 785);
Код: Выделить всё
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 ... te-records
Мобильная версия