Как мне получить значение в сопоставлении отношений ManyToOne с помощью @Query?

#hibernate #jpa #spring-data-jpa #spring-data

#спящий режим #jpa #spring-data-jpa #spring-данные

Вопрос:

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

Хотя я могу получать разные значения, то, что я пытаюсь получить сейчас, — это получить значения внутри поля, которое сопоставлено с @ManyToOne . На данный момент я могу получить только внешний ключ (FK), но я хотел бы получить другое значение из отношения. Например, я хотел бы получить значение countryphonecode из CountryPhoneCodeModel . Я включил свой уровень репозитория, чтобы показать, как я получаю различные значения прямо сейчас.

SubContactModel:

 @Data
@Entity
public class SubContactModel implements Serializable {


    @Id
    @Column(name = "SUBCONTACTID", updatable = false, unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long subcontactID;
    
    @ManyToOne() 
    @JoinColumn(name="PRSNTITLEID", nullable=true, updatable=true)
    private PersonTitleModel personTitleID;  // Person Title
    
    @ManyToOne()
    @JoinColumn(name = "countryPhonecode", nullable = true, updatable = true)
    private CountryPhoneCodeModel countryPhoneCodeModel; // Country Code 

    
    @Column(name = "name", nullable = true, length = 50)
    private String name;

    
    @Column(name = "designation", nullable = true, length = 50)
    private String designation;

    @Column(name = "telnumber", nullable = true, length = 50)
    private String telnumber;

    @Column(name = "email", nullable = true, length = 50)
    private String email;
    
    @ManyToOne()
    @JoinColumn(name="PERSONID", nullable=true, updatable=true)
    private PersonModel personID;
    
}
  

CountryPhoneCodeModel:

 public class CountryPhoneCodeModel implements Serializable {

    @Id
    @Column(name="CPHONECODEID",updatable = false,unique = true,nullable = false )
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long countryPhoneCodeID;
    
    @Column(name="CPHONECODE",updatable=true,nullable=false,length=50)
    private String countryPhoneCode;
    
    @Column(name="COUNTRYNAME",updatable=true,nullable=false,length=50)
    private String countryName;
    
    @Column(name="DIALCODE",updatable=true,nullable=false,length=50)
    private String dialCode;
}
  

Уровень репозитория :

 @Repository
public interface SubContactRepo extends JpaRepository<SubContactModel, Long> {
     
@Query(value="SELECT DISTINCT u.designation,u.name,u.telnumber,u.countryphonecode,u.prsntitleid FROM subcontactmodel u WHERE u.email = :email", nativeQuery = true)
    List <Object> findDistinctResult (String email);
}

  

Ответ №1:

Я нашел решение для этого:

Я удалил NativeQuery = true и изменил имена полей в @Query, чтобы они соответствовали имени в моей сущности, а не именам столбцов таблицы в базе данных.

 @Query(value="SELECT DISTINCT u.designation,u.name,u.telnumber, u.countryPhoneCodeModel.countryPhoneCode ,u.personTitleID.personTitleName FROM SubContactModel u WHERE u.email= :email")
List <Object> findDistinctResult (String email);

  

Теперь это работает так, как я хочу!