Почему поля проекции не задаются при извлечении данных с использованием проекции путем объединения двух не связанных между собой объектов в JPA? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь получить некоторые конкретные значения столбца, используя проекцию, объединяя две не связанные сущности.Но я не получаю никаких ценностей.Код репозитория: -


    @Repository
    public interface PersonRepository extends CrudRepository<Person, Long> {
        @Query("SELECT p.id,p.firstName,p.lastName,a.city FROM Person p INNER JOIN Address a on p.id = a.personId")
        public List<PersonAndAddressSummary> findAllPersonSummary();
    }

Класс персоны

@Entity
public class Person {
    @Id
    private long id;
    private String firstName;
    private String lastName;
    private long phone;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public long getPhone() {
        return phone;
    }

    public void setPhone(long phone) {
        this.phone = phone;
    }
}
Address class

    @Entity
    public class Address {
        @Id
        private int id;
        private String street;
        private String state;
        private int personId;
        private String country;
        private int houseNo;
        private String city;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getStreet() {
            return street;
        }

        public void setStreet(String street) {
            this.street = street;
        }

        public String getState() {
            return state;
        }

        public void setState(String state) {
            this.state = state;
        }

        public int getPersonId() {
            return personId;
        }

        public void setPersonId(int personId) {
            this.personId = personId;
        }

        public String getCountry() {
            return country;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        public int getHouseNo() {
            return houseNo;
        }

        public void setHouseNo(int houseNo) {
            this.houseNo = houseNo;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }
    }

Интерфейс проекции

public interface PersonAndAddressSummary {
    public String getId();

    public String getFirstName();

    public String getLastName();

    public String getCity();
}

После выполнения этого приложения Spring Boot выводится Iполучить это.

[{"lastName":null,"firstName":null,"city":null,"id":null},{"lastName":null,"firstName":null,"city":null,"id":null},{"lastName":null,"firstName":null,"city":null,"id":null}]

Хотя есть доступные записи, которые идеально подходят для каждого человека в классе адресов (данные доступны в человеке и таблицы адресов).

1 Ответ

1 голос
/ 25 сентября 2019

Если нет объединения двух сущностей, вы не можете получить данные другой сущности. Каждый репозиторий является специфичным для класса в jpa.Вы должны определить разные проекции для каждого класса.

@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {
@Query("SELECT p FROM Person p")
public List<PersonAndSummary> findAllPersonSummary();
}


@Repository
public interface AddressRepository extends CrudRepository<Address, Long> {
@Query("SELECT a FROM Address a where a.personId=:personId")
public AddressSummary findAddressSummary(@Param("personId") int personId);
}



public interface PersonSummary {
   public String getId();
   public String getFirstName();
   public String getLastName();
}


public interface AddressSummary {

   public String getCity();
}


public interface PersonAndAddressSummary extends PersonSummary, AddressSummary{
 }

Теперь в вашем классе обслуживания найдите список personSummary.Теперь итерируйте этот список и получите AddressSummary по personId.

List<PersonSummary> personSummaryList = yourRepositoryName.findAllPersonSummary();
List<PersonAndAddressSummary> list = new ArrayList<>();
for(PersonSummary summary: personSummaryList){
  AddressSummary addressSummary = repositoryName.findAddressSummary(summary.getId());
//now add required fields in your list
}
...