Как написать SQL-запрос, который отображает список, назначенный только вошедшему в систему пользователю?

#java #sql #spring-boot #spring-security #spring-data-jpa

Вопрос:

У меня есть набор пользователей с разными типами ролей Маркетолог , Администратор, Генеральный менеджер. Когда учетная запись клиента зарегистрирована , в столбце отображается имя Маркетолога, назначенного Клиенту . Я создал отношения @ManyToOne и @OneToMany между пользователями и Клиентами. Когда маркетолог типа пользователя входит в программное обеспечение , я хочу, чтобы маркетолог видел только клиентов, зарегистрированных на имя маркетолога, вошедшего в систему. Это кажется сложным, потому что сначала мне нужно получить данные зарегистрированного маркетолога, используя имя пользователя, затем получить имя и фамилию, а затем отобразить список клиентов, назначенных этому имени.

Это организация-заказчик

 @Entity @JsonIgnoreProperties({"hibernateLazyInitializer","handler"}) public class Customer implements Serializable {   /**  *   */  private static final long serialVersionUID = 8348682056500740593L;  @Id  @GeneratedValue(strategy=GenerationType.IDENTITY)  private Long id;  private String userName;  private String password;  private String firstName ;  private String lastName;    private String gender;  private String Address;   private String maritalStatus;  private String category;  private String motherMaidenName;  private String idType;  private String idNumber;  private String phoneNumber;  private String email;    @DateTimeFormat(pattern = "yyyy-MM-dd")  private Date dateOfBirth;    @DateTimeFormat(pattern = "yyyy-MM-dd")  private Date registrationDate;      @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})  @ManyToOne(targetEntity = User.class,   fetch = FetchType.LAZY )  @JoinColumn(name="marketer_id")   private User marketer ;    @JsonBackReference  @OneToMany(mappedBy="customer_id",cascade = CascadeType.ALL, targetEntity=Investment.class)  private List lt;Investmentgt; investment;   

Это сущность пользователя

 @Entity public class User {     @Id  @GeneratedValue(strategy=GenerationType.IDENTITY)  private Long id;    private String firstName ;  private String lastName;  private String username;  private String password;  private String Gender;   private String phoneNumber;  private String email;  private String branch;    @DateTimeFormat(pattern = "yyyy-MM-dd")  private Date createdDate;    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)  @JoinTable(  name = "users_roles",   joinColumns = @JoinColumn(name = "user_id"),  inverseJoinColumns = @JoinColumn(name = "role_id")  )  private Setlt;UserRolegt; userRole = new HashSetlt;gt;();    @Enumerated(EnumType.STRING)  private UserStatus status;    @JsonBackReference  @OneToMany(mappedBy="marketer",cascade = CascadeType.ALL, targetEntity=Customer.class)  private List lt;Customergt; customer;   

This is the User Repository that contains a FindByUsername method that’s being used by JWT authentication manager

 @Repository public interface UserAccountRepository extends JpaRepository lt;User, Longgt; {    Optionallt;Usergt; findById(Long id);   User findByUsername(String username); }   

ОБНОВЛЕНО : Я получил пустой ответ на запрос , что я могу сделать не так ? Это обновленный класс контроллера клиента

 @CrossOrigin(origins = {"http://localhost:3000"}) @RestController public class CustomerController {  @Autowired CustomerAccountService customerRepo;  @Autowired UserAccountService userRepo;   @GetMapping(value="marketers/customers")  public Listlt;Customergt; getLlistByMarketerName(){  Authentication authentication = SecurityContextHolder.getContext().getAuthentication();   User loggedInUser =userRepo.findByUserName(authentication.getName());  System.out.println("logged in user:"  loggedInUser);  return customerRepo.findByMarketer(loggedInUser);   

Я распечатал переменную loggedInUser, но она показывает значение null.

Ответ №1:

Ваша клиентская база должна легко справиться с этим:

 public interface CustomerRepository extends JpaRepositorylt;Customer, Longgt; {  Listlt;Customergt; findByMarketer(User marketer); }  

Если вы хотите быть более откровенным и показать запрос:

 public interface CustomerRepository extends JpaRepositorylt;Customer, Longgt; {  @Query("select customer from Customer customer join customer.marketer marketer where marketer = :marketer")  Listlt;Customergt; findByMarketer(User marketer); }  

Переданным пользователем (маркетологом) является текущий пользователь, полученный из учетной записи пользователя.

Комментарии:

1. То, что я получил, — это пустой или пустой ответ