🐫 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