TGViewer
Spring АйО Spring АйО @spring_aio · 11K subscribers
Post #169 3.33K
🐫 Underscore в имени Spring Data JPA методов

Все мы знаем, что для именования методов в java принято использовать lowerCamelCase. Но при определенных обстоятельствах правила можно и даже нужно нарушать! Например, когда в игру вступают фреймворки. Один такой пример мы сегодня с вами рассмотрим.

Предположим, у нас есть модель питомец-владелец питомца (многие-к-одному). Чтобы повысить перформанс нашего приложения, нам пришлось немного декомпозировать модель, добавив атрибут в класс питомца, в котором будет храниться информация о владельце – ownerLastName.

Класс питомца:

@Getter
@Setter
@Entity
@Table(name = "pet")
public class Pet {
@Id
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "owner_id")
private Owner owner;
@Column(name = "owner_last_name")
private String ownerLastName;
}


И класс владельца питомца:

@Getter
@Setter
@Entity
@Table(name = "owner")
public class Owner {
@Id
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@OneToMany(mappedBy = "owner", orphanRemoval = true)
private Set<Pet> pets = new LinkedHashSet<>();
}


Используя Spring Data JPA и derived методы нужно учитывать следующий нюанс. Получение списка питомцев по имени их владельца с выборкой именно по столбцу из таблицы с владельцами, а не по полю ownerLastName будет выглядеть следующим образом:

public interface PetRepository extends JpaRepository<Pet, Integer> {
List<Pet> findByOwner_LastName(String lastName);
}


Здесь нам пришлось правила именования и определить метод с "_" перед атрибутом. В этом случае Hibernate сгенерирует следующий запрос:

select *
from pet
left join owner on id=pet.owner_id
where owner.last_name=?


А если же мы хотим получить значения из таблицы pet, а не из owner, то нужно объявить метод без нижнего подчеркивания:

public interface PetRepository extends JpaRepository<Pet, Integer> {
List<Pet> findByOwnerLastName(String lastName);
}


Тогда поиск будет осуществлен по колонке из таблицы pet:

select *
from pet
where pet.owner_last_name=?


Подробнее про именование Spring Data JPA методов можно прочитать в документации.

P.S. А знаете ли вы ещё примеры подобного слома шаблонов?

#SpringTips #JPA
  • 🔥 37
  • 👍 16
  • ❤ 4
  • 🤔 3
More from @spring_aio
  1. Oct 16, 2026😀 Joker 2026 && Spring АйО 🍃 Два дня в Петербурге пролетели быстрее, чем прогрев JVM. До…
  2. Oct 11, 2026🎬 Записи докладов с JPoint 2026 уже в открытом доступе JUG Ru Group выложили записи с про…
  3. Oct 9, 2026👩‍💻 Kotlin получил почти настоящие статики Начиная с Kotlin 2.5.0-Beta1 можно эксперимен…
  4. Oct 8, 2026🍃 Spring Boot ломает совместимость, G1 тормозит микросервисы, Java долго релизит фичи | S…
  5. Oct 6, 2026👩‍💻 Spring Config Import без магии У наших друзей из Axelix вышла статья о том, как Spri…
  6. Oct 5, 2026🥲 В Java 27 TLS научился переживать квантовую атаку При установке HTTPS-соединения клиент…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →