Java JPA - поиск пользователя по нескольким таблицам - PullRequest
0 голосов
/ 11 апреля 2020

Я работаю с устаревшей базой данных, которая, так сказать, не структурирована наилучшим образом.

У меня есть 3 таблицы

  1. учетная запись
  2. пользователей
  3. stats_agents

Теперь в таблице счетов хранится ' данные основной учетной записи с некоторыми дополнительными настройками / параметрами учетной записи В таблице «Пользователи» содержатся сведения обо всех пользователях, определенных в системе. В таблице «Агенты» содержатся сведения обо всех агентах, которые работают с системой.

Агенты и пользователи не совпадают (я не буду подробно останавливаться на их функциональности в системе, поскольку это не имеет значения)

Теперь у меня есть кусок кода, который доставляет желаемый результат, но я не считаю его элегантным. Целью кода является: - Получить параметры входа из URL, выполнить поиск в этих 3 таблицах и найти соответствующий результат.

public interface AccountRepository extends JpaRepository<Account, Integer> {

    /**
     * Retrieve Admin account specific information
     * @param email
     * @return
     */
    @Query(value = "Select account.id, account.email as masteremail, account.password as masterpassword, "
            + "users.id as userid, users.email as useremail, users.password as userpassword,"
            + "stats_agent.id as agentid, stats_agent.username as agentusername, stats_agent.password as agentpassword "
            + "from account join users on account.id = users.accountid join stats_agent on account.id = stats_agent.accountid "
            + "where account.email= :email or users.email= :email or stats_agent.username= :email limit 1", nativeQuery = true)
    List<Account> getAccount(@Param("email") String email);



}

Класс Entity ниже:

@Entity
@SecondaryTables({
        @SecondaryTable(name = "users", pkJoinColumns = @PrimaryKeyJoinColumn(name = "accountid")),
        @SecondaryTable(name = "stats_agent", pkJoinColumns = @PrimaryKeyJoinColumn(name = "accountid"))
})
public class Account {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private Integer id; 

    @Column(name = "masteremail", table = "account")
    private String masteremail; 

    @Column(name = "masterpassword", table = "account")
    private String masterpassword;

    @Column(name = "userid", table = "users")
    private Integer userId;

    @Column(name = "useremail", table = "users")
    private String userEmail;

    @Column(name = "userpassword", table = "users")
    private String userPassword;

    @Column(name = "agentid", table = "stats_agent")
    private String agentid;

    @Column(name = "agentusername", table = "stats_agent")
    private String agentusername;

    @Column(name = "agentpassword", table = "stats_agent")
    private String agentpassword;

    @Override
    public String toString() {
        return "Account [id=" + id + ", masteremail=" + masteremail + ", masterpassword=" + masterpassword + ", userId="
                + userId + ", userEmail=" + userEmail + ", userPassword=" + userPassword + ", agentid=" + agentid
                + ", agentusername=" + agentusername + ", agentpassword=" + agentpassword + "]";
    }

В тот момент, когда я ввожу основной адрес электронной почты, я получаю правильные данные из таблицы Account, но сверху я также получаю информацию от таблица агента и таблица пользователей

примерно так: [Account [id=1, masteremail=maciej@alpha.com, masterpassword=1234, userId=1, userEmail=test@alpha.com, userPassword=test, agentid=83, agentusername=1004, agentpassword=1004]]

Теперь, в идеале, если я введу адрес электронной почты, он будет только извлекать запись из соответствующей таблицы, где найдет совпадение, и следовательно, другие поля будут нулевыми, так как я думаю, что в данный момент вывод неуклюжий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...