Я работаю с устаревшей базой данных, которая, так сказать, не структурирована наилучшим образом.
У меня есть 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]]
Теперь, в идеале, если я введу адрес электронной почты, он будет только извлекать запись из соответствующей таблицы, где найдет совпадение, и следовательно, другие поля будут нулевыми, так как я думаю, что в данный момент вывод неуклюжий