рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдмрджрд▓рдирд╛, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рд╡рд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗред
рд╕рд╛рдордЧреНрд░реА:
- рд╡рд╕рдВрдд рдХрд╛ рднрдВрдбрд╛рд░
- рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рд╕реЗ рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рд╕реЗрдЯрдЕрдк
- рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
- рдХрд╕реНрдЯрдо рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
- рдХрд╕реНрдЯрдо рдмреЗрд╕ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА
- рдХреНрд╡реЗрд░реА рддрд░реАрдХреЗ - рдХреНрд╡реЗрд░реА
1. рд╕реНрдкреНрд░рд┐рдВрдЧ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдореЗрдВ рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИред рдпреЗ рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдкреАрдП рдПрдВрдЯрд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID>
рдбреЗрдЯрд╛ (CRUD рд╕рдВрдЪрд╛рд▓рди) рдХреЛ рдЦреЛрдЬрдиреЗ, рд╕рд╣реЗрдЬрдиреЗ, рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
T save(T entity); Optional findById(ID primaryKey); void delete(T entity);
рдФрд░ рдЕрдиреНрдп рдСрдкрд░реЗрд╢рдиред
рдЕрдиреНрдп рдЕрдореВрд░реНрддрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдкреЗрдЬрд┐рдВрдЧрдПрдВрдбрд╕реЙрд░реНрдЯрд┐рдВрдЧрд░рд┐рдкреЛрд╕реЗрд░реАред
рдпрд╛рдиреА рдпрджрд┐ рд╕реВрдЪреА рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рд╡рд╣ рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рддреЛ рдЖрдк рд╕реАрдзреЗ рдЕрдкрдиреА рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреНрд╡реЗрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЙрди рдЪрд░рдгреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬреЛ рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, ORM, рдбреЗрдЯрд╛рдмреЗрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрдм рддрдХ рд╡рд┐рдЪрд▓рд┐рдд рд╣реБрдП рдмрд┐рдирд╛) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред
1. рдПрдХ рдЗрдХрд╛рдИ рдмрдирд╛рдПрдБ
@Entity @Table(name = "EMPLOYEES") public class Employees { private Long employeeId; private String firstName; private String lastName; private String email;
2. рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП CrudRepository рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛
@Repository public interface CustomizedEmployeesCrudRepository extends CrudRepository<Employees, Long>
3. рдЧреНрд░рд╛рд╣рдХ (рд╕реЗрд╡рд╛) рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
@Service public class EmployeesDataService { @Autowired private CustomizedEmployeesCrudRepository employeesCrudRepository; @Transactional public void testEmployeesCrudRepository() { Optional<Employees> employeesOptional = employeesCrudRepository.findById(127L);
рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рд░реЗрдбреА-рдореЗрдб
FindById рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╛рдиреА рдЗрддрдиреА рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛, рд╣рдореЗрдВ CrudRepository рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рддреИрдпрд╛рд░ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ:
S save(S var1); Iterable<S> saveAll(Iterable<S> var1); Optional<T> findById(ID var1); boolean existsById(ID var1); Iterable<T> findAll(); Iterable<T> findAllById(Iterable<ID> var1); long count(); void deleteById(ID var1); void delete(T var1); void deleteAll(Iterable<? extends T> var1); void deleteAll();
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╕реВрдЪреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╡реЗрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
2. рд╡рд┐рдзрд┐ рдирд╛рдо рд╕реЗ рдХреНрд╡реЗрд░реА рд╡рд┐рдзрд┐
рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╡рд┐рдзрд┐ рдирд╛рдо рд╕реЗ рд╕реАрдзреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЦреЛрдЬ ... рджреНрд╡рд╛рд░рд╛, рдкрдврд╝реЗрдВ ... рджреНрд╡рд╛рд░рд╛, рдХреНрд╡реЗрд░реА ... рджреНрд╡рд╛рд░рд╛, рдЧрд┐рдирддреА ... рджреНрд╡рд╛рд░рд╛, рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ... рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдЧреЗ рд╡рд┐рдзрд┐ рдЙрдкрд╕рд░реНрдЧ рд╕реЗ, рдпрд╣ рдЗрд╕рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╡рд╛рдХреНрдп рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рд╕реНрдЯрд┐реНрд░рдХреНрдЯред рдЕрдЧрд▓рд╛, рдкрд╣рд▓рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирджрдВрдбреЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрдХрд╛рдИ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдФрд░ рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг
@Repository public interface CustomizedEmployeesCrudRepository extends CrudRepository<Employees, Long> {
рдкреНрд░рд▓реЗрдЦрди рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдоред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЗрдХрд╛рдИ рдЯреА, рд╡реИрдХрд▓реНрдкрд┐рдХ, рд╕реВрдЪреА, рд╕реНрдЯреНрд░реАрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдЗрдбрд┐рдпрд╛, рдХреНрд╡реЗрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рд╣реИред

рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛, рдФрд░ рд╡рд╕рдВрдд рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред
@SpringBootTest public class DemoSpringDataApplicationTests { @Autowired private CustomizedEmployeesCrudRepository employeesCrudRepository; @Test @Transactional public void testFindByFirstNameAndLastName() { Optional<Employees> employeesOptional = employeesCrudRepository.findByFirstNameAndLastName("Alex", "Ivanov");
3. рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╕реЗрдЯрдЕрдк
рдкреВрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ
рдЬреАрдердм рдбреЗрдореЛрд╕реНрдкреНрд░рд┐рдВрдЧрдбрд╛рдЯрд╛рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдлреАрдЪрд░реНрд╕ рдкрд░ рдЯрдЪ рдХрд░реВрдВрдЧрд╛ред
TransactionManager, dataSource, рдФрд░ unitManagerFactory рд╕реЗрдо рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред Xmlред рдЗрд╕рдореЗрдВ рднреА рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЬрд░реВрд░реА рд╣реИ
<jpa:repositories base-package="com.example.demoSpringData.repositories"/>
рдкрде рдЬрд╣рд╛рдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
EntityManagerFactory рд╣рд╛рдЗрдмрд░рдиреЗрдЯ ORM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, Oracle XE рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рд╣реИ, рдпрд╣рд╛рдВ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ, рд╕рдВрджрд░реНрдн рдореЗрдВред xml рдпрд╣ рд╕рдм рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред Pom рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реИрдВред
4. рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдХреНрд╡реЗрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ, рдЙрдирдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ, рдЖрдк рд╡рд┐рд╢реЗрд╖ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Pageable, Sort, рд╕рд╛рде рд╣реА Top рдФрд░ First рдкрд░ рдкреНрд░рддрд┐рдмрдВрдзред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣, рдЖрдк рджреВрд╕рд░реЗ рдкреГрд╖реНрда (-0 рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛), рддреАрди рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рдердо рдирд╛рдо рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд┐рдзрд┐ рдореЗрдВ рдкреИрдЬреЗрдмрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд┐рдзрд┐ рдирд╛рдо рд╕реЗ рдорд╛рдирджрдВрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - "рдлрд░реНрд╕реНрдЯрдирд╛рдо рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗрдВ% рдХреЗ рд╕рд╛рде рд╢реБрд░реВ
@Repository public interface CustomizedEmployeesCrudRepository extends CrudRepository<Employees, Long> { List<Employees> findByFirstNameStartsWith(String firstNameStartsWith, Pageable page);
5. рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рд╕реЗ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХрддрдо рд╡реЗрддрди рд╡рд╛рд▓реЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ
public interface CustomizedEmployees<T> { List<T> getEmployeesMaxSalary(); }
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред HQL (SQL) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдЭреЗ рдЕрдзрд┐рдХрддрдо рд╡реЗрддрди рд╡рд╛рд▓реЗ рдХрд░реНрдордЪрд╛рд░реА рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрднрд╡ рд╣реИрдВред
public class CustomizedEmployeesImpl implements CustomizedEmployees { @PersistenceContext private EntityManager em; @Override public List getEmployeesMaxSalary() { return em.createQuery("from Employees where salary = (select max(salary) from Employees )", Employees.class) .getResultList(); } }
рдФрд░ CustomEmployees рдХреЗ рд╕рд╛рде Crud Repository Employees рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ред
@Repository public interface CustomizedEmployeesCrudRepository extends CrudRepository<Employees, Long>, CustomizedEmployees<Employees>
рдпрд╣рд╛рдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
рдЗрдореНрдкреНрд▓рд┐рдореЗрдВрдЯ рдкрд░ рдХреНрд▓рд╛рд╕ рдЗрдВрдкреНрд▓реАрдореЗрдВрдЯрд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕) рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛
<repositories base-package="com.repository" repository-impl-postfix="MyPostfix" />
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛
public class DemoSpringDataApplicationTests { @Autowired private CustomizedEmployeesCrudRepository employeesCrudRepository; @Test @Transactional public void testMaxSalaryEmployees() { List<Employees> employees = employeesCrudRepository.getEmployeesMaxSalary(); employees.stream() .forEach(e -> System.out.println(e.getFirstName() + " " + e.getLastName() + " " + e.getSalary())); }
рдПрдХ рдЕрдиреНрдп рдорд╛рдорд▓рд╛ рдЬрдм рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ
рдПрдХ рдореМрдЬреВрджрд╛ рд╡рд┐рдзрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░реВрдб рд░рд┐рдкреЗрд░рд┐рдЯрд░реА рдореЗрдВ рд╣рдЯрд╛рдПрдВ, рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдЯрд╛рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред рддрдХрдиреАрдХ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕реА рд╣реА рд╣реИред рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
public interface CustomizedEmployees<T> { void delete(T entity);
рдЕрдм, рдпрджрд┐ рдЖрдк рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ
рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рд╣рдЯрд╛рдП рдЧрдП рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реЛрдВрдЧреЗред
6. рдпреВрдЬрд░ рдмреЗрд╕ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдХреНрд░реВрдб рдореЗрдВ рдХрд┐рд╕реА рдЗрдХрд╛рдИ рдХреЗ рдбрд┐рд▓реАрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреИрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЛ рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рди рдмрдирд╛рдПрдВ ... рддреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдореЗрдВ рдЖрдк рдЕрдкрдиреЗ рдЖрдзрд╛рд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ (рдпрд╛ рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдо) рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣рд╛рдВ, рдореЗрд░реА рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдирд╛
рдмреЗрд╕рдЗрдВрдЯрд┐рдЯреА рдЗрдВрдЯрд░рдлреЗрд╕ рдкреЗрд╢ рдХрд┐рдпрд╛ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ), рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рддрд░реАрдХреЗ рдЗрдХрд╛рдИ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред
public interface BaseEntity { Boolean getDeleted(); void setDeleted(Boolean deleted); }
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рдмреЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛
<jpa:repositories base-package="com.example.demoSpringData.repositories" base-class="com.example.demoSpringData.BaseRepositoryImpl"/>
рдЕрдм рдХрд░реНрдордЪрд╛рд░реА рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА (рдФрд░ рдЕрдиреНрдп) рдХреЛ рдмреЗрд╕рдкрд░реЛрд╕рд┐рдЯрд░реА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
public interface EmployeesBaseRepository extends BaseRepository <Employees, Long> {
рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛
public class DemoSpringDataApplicationTests { @Resource private EmployeesBaseRepository employeesBaseRepository; @Test @Transactional @Commit public void testBaseRepository() { Employees employees = new Employees(); employees.setLastName("Ivanov");
рдЕрдм, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдЙрди рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдмреЗрд╕рдкреНрд░реЛрд╕реЗрд░рд┐рдЯрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЦреЛрдЬ рд╡рд┐рдзрд┐ -
рдХреНрд╡реЗрд░реА рдмрд╛рдп рдЙрджрд╛рд╣рд░рдг (QBE) рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдереА, рдореИрдВ рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХред
7. рдХреНрд╡реЗрд░реА рдХреЗ рддрд░реАрдХреЗ - рдХреНрд╡реЗрд░реА
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдпрд╛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд┐рдзрд┐ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреБрдЫ рдЕрдиреБрдХреВрд▓рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (CustomEmployees) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЖрдк рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрд╡реЗрд░реА (HQL рдпрд╛ SQL) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред
GetEmployeesMaxSalary рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдФрд░ рднреА рд╕рд░рд▓ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╡реЗрддрди рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рдХрд░реВрдВрдЧрд╛ред рдпрд╛рдиреА рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЧрдгрдирд╛ рдкрджреНрдзрддрд┐ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
@Repository public interface CustomizedEmployeesCrudRepository extends CrudRepository<Employees, Long>, CustomizedEmployees<Employees> { @Query("select e from Employees e where e.salary > :salary") List<Employees> findEmployeesWithMoreThanSalary(@Param("salary") Long salary, Sort sort);
рдЪреЗрдХ
@Test @Transactional public void testFindEmployeesWithMoreThanSalary() { List<Employees> employees = employeesCrudRepository.findEmployeesWithMoreThanSalary(10000L, Sort.by("lastName"));
рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреЗ рдЕрдиреБрд░реЛрдз рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд
@Modifying рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ
@Modifying @Query("update Employees e set e.firstName = ?1 where e.employeeId = ?2") int setFirstnameFor(String firstName, String employeeId);
рдХреНрд╡реЗрд░реА рдПрдиреЛрдЯреЗрд╢рди рдХреА рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрдкреЗрд▓ рднрд╛рд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ
# {# рдПрдВрдЯреНрд░реАрдирд╛рдо " рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЗрдХрд╛рдИ рдбреЛрдореЗрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЬрдм рдореБрдЭреЗ рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП "рд╣рдЯрд╛рдП рдЧрдП" рдЪрд┐рд╣реНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореИрдВ "рд╣рдЯрд╛рдП рдЧрдП" рдпрд╛ "рд╕рдХреНрд░рд┐рдп" рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдКрдВрдЧрд╛ред
@NoRepositoryBean public interface ParentEntityRepository<T> extends Repository<T, Long> { @Query("select t from #{#entityName} t where t.deleted = ?1") List<T> findMarked(Boolean deleted); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХреЛ рдЗрд╕рд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди "рдмреЗрд╕-рдкреИрдХреЗрдЬ" рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, @NoRepositoryBean рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░реЗрдВред
рдХрд░реНрдордЪрд╛рд░реА рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА
@Repository public interface EmployeesEntityRepository extends ParentEntityRepository <Employees> { }
рдЕрдм рдЬрдм рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрдХрд╛рдИ рдирд╛рдо
T рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рдХрд╛рдп рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ ParentEntityRepository рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛ред
рдирд┐рд░реАрдХреНрд╖рдг
@SpringBootTest public class DemoSpringDataApplicationTests { @Autowired private EmployeesEntityRepository employeesEntityRepository; @Test @Transactional public void testEntityName() { List<Employees> employeesMarked = employeesEntityRepository.findMarked(true);
рд╕рд╛рдордЧреНрд░реА
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП - рд╕рдВрджрд░реНрдн рдкреНрд░рд▓реЗрдЦрдирдЧрд┐рдердм рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ