繁体   English   中英

使用join springboot从两个表中检索数据

[英]retrieving data from two tables with join springboot

我在用户表和地址表之间进行了连接。 我收到一条错误消息:“errorMessage”:“无法调用“com.pastrycertified.cda.models.Address.getId()”,因为“地址”为空”。 我无法检索我看不到它来自哪里的用户的地址。 它在尝试检索地址时返回 null。 谢谢你的帮助

用户模型:

public class User extends AbstractEntity implements UserDetails{

    private String civility;

    private String lastname;

    private String firstname;

    @Column(unique = true)
    private String email;

    private String password;

    private String phone;

    private String birth_day;

    private Integer idAddress;

    @OneToOne
    private Address address;

    @OneToOne
    private Role role;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return Collections.singletonList(new SimpleGrantedAuthority(role.getName()));
    }

    @Override
    public String getUsername() {
        return getEmail();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

地址Model:

public class Address extends AbstractEntity{

    private Integer address_number;

    private String street;

    private String zipCode;

    private String city;

    private String country;

    @OneToOne
    @JoinColumn(name = "id_user")
    private User user;
}

用户Dto

public class UserDto {

    private Integer id;

    private String civility;

    private String lastname;

    private String firstname;

    private String birth_day;
 
    private String email;

    private String password;

    private String phone;

    private String role_name;

    private AddressDto address;

    public static UserDto fromEntity(User user) {

        return UserDto.builder()
                .id(user.getId())
                .civility(user.getCivility())
                .lastname(user.getLastname())
                .firstname(user.getFirstname())
                .birth_day(user.getBirth_day())
                .email(user.getEmail())
                .password(user.getPassword())
                .phone(user.getPhone())
                .role_name(user.getRole().getName())
                .address(AddressDto.fromEntity(user.getAddress()))
                .build();
    }

    public static User toEntity(UserDto user) {
        return User.builder()
                .id(user.getId())
                .civility(user.getCivility())
                .lastname(user.getLastname())
                .firstname(user.getFirstname())
                .birth_day(user.getBirth_day())
                .email(user.getEmail())
                .password(user.getPassword())
                .phone(user.getPhone())
                .role(
                        Role.builder()
                                .name(user.role_name)
                                .build()
                )
                .address(AddressDto.toEntity(user.getAddress()))
                .build();
    }
}

地址Dto

public class AddressDto {

    private Integer id;

    private Integer address_number;

    private String street;

    private String zipCode;

    private String city;

    private String country;

    private Integer userId;

    private Integer id_user;

    public static AddressDto fromEntity(Address address) {

        return AddressDto.builder()
                .id(address.getId())
                .address_number(address.getAddress_number())
                .street(address.getStreet())
                .zipCode(address.getZipCode())
                .city(address.getCity())
                .country(address.getCountry())
                .userId(address.getUser().getId())
                .build();
    }

    public static Address toEntity(AddressDto address) {

        return Address.builder()
                .id(address.getId())
                .address_number(address.getAddress_number())
                .street(address.getStreet())
                .zipCode(address.getZipCode())
                .city(address.getCity())
                .country(address.getCountry())
                .user(
                        User.builder()
                                .id(address.getUserId())
                                .build()
                )
                .build();
    }
}

用户服务实现

public class UserServiceImpl implements UserService {

    private final UserRepository userRepository;

    @Override
    public UserDto findUserById(Integer id) {
        return userRepository.findUserById(id)
                .map(UserDto::fromEntity)
                .orElseThrow(() -> new EntityNotFoundException("Aucun utilisateur n'a été trouvé avec l'ID fourni :" + id));
    }
}

地址服务实现

public class AddressServiceImpl implements AddressService {

    private final AddressRepository addressRepository;
    private final ObjectsValidator<AddressDto> validator;

    @Override
    public AddressDto findById(Integer id) {
        return addressRepository.findById(id)
                .map(AddressDto::fromEntity)
                .orElseThrow(()-> new EntityNotFoundException("L'adresse n'existe pas"));
    }

    @Override
    public AddressDto findAddressByIdUser(Integer id) {
        return addressRepository.findAddressByIdUser(id)
                .map(AddressDto::fromEntity)
                .orElseThrow(()-> new EntityNotFoundException("L'utilisateur ne posséde pas d'adresse"));
    }
        addressRepository.save(address);
        return address.getId();
    }

}

用户资料库

public interface UserRepository extends JpaRepository<User, Integer> {

    @Query(value = "SELECT * FROM user INNER JOIN role ON user.role_id = role.id INNER JOIN address ON user.id = address.id_user WHERE user.id = :id", nativeQuery = true)
    Optional<User> findUserById(Integer id);
}

您可以如下所示更新您的存储库并重试吗?

public interface UserRepository extends JpaRepository<User, Integer> {

@Query(value = "SELECT * FROM user 
LEFT JOIN role ON user.role_id = role.id 
LEFT JOIN address ON user.id = address.id_user 
WHERE user.id = :id", nativeQuery = true)
Optional<User> findUserById(Integer id);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM