π« Underscore Π² ΠΈΠΌΠ΅Π½ΠΈ Spring Data JPA ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²
ΠΡΠ΅ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ Π΄Π»Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π² java ΠΏΡΠΈΠ½ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ lowerCamelCase. ΠΠΎ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²Π°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π΄Π°ΠΆΠ΅ Π½ΡΠΆΠ½ΠΎ Π½Π°ΡΡΡΠ°ΡΡ! ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π² ΠΈΠ³ΡΡ Π²ΡΡΡΠΏΠ°ΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ. ΠΠ΄ΠΈΠ½ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΡ ΡΠ΅Π³ΠΎΠ΄Π½Ρ Ρ Π²Π°ΠΌΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ.
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠΈΡΠΎΠΌΠ΅Ρ-Π²Π»Π°Π΄Π΅Π»Π΅Ρ ΠΏΠΈΡΠΎΠΌΡΠ° (ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊ-ΠΎΠ΄Π½ΠΎΠΌΡ). Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π°ΡΡΠΈΠ±ΡΡ Π² ΠΊΠ»Π°ΡΡ ΠΏΠΈΡΠΎΠΌΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ β ownerLastName.
ΠΠ»Π°ΡΡ ΠΏΠΈΡΠΎΠΌΡΠ°:
Π ΠΊΠ»Π°ΡΡ Π²Π»Π°Π΄Π΅Π»ΡΡΠ° ΠΏΠΈΡΠΎΠΌΡΠ°:
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ Spring Data JPA ΠΈ
ΠΠ΄Π΅ΡΡ Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ Ρ "_" ΠΏΠ΅ΡΠ΅Π΄ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Hibernate ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ:
Π Π΅ΡΠ»ΠΈ ΠΆΠ΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ
Π’ΠΎΠ³Π΄Π° ΠΏΠΎΠΈΡΠΊ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ ΠΏΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΏΡΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Spring Data JPA ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
P.S. Π Π·Π½Π°Π΅ΡΠ΅ Π»ΠΈ Π²Ρ Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΌΠ° ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ²?
#SpringTips #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