Как получить уникальную строку в SQL из одного столбца, который же значение в JPA? - PullRequest
0 голосов
/ 20 июня 2019

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

Например, в моей базе данных есть столбец с именем name и phoneNumber:

1. name : John, phoneNumber: 123;
2. name : Dion, phoneNumber: 123;

Я действительно хочу получить результат только один, который показывает только новый и уникальный, я мог бы реализовать его с помощью SELECT DISTINCT ....., поэтому я получу только уникальный, я пытался SELECT DISTINCT name, phoneNumber FROM Contacts*

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

У меня есть DTO (ОБЪЕКТ ПЕРЕДАЧИ ДАННЫХ), как это

public ContactsDTO {
   private String name;
   private String phoneNumber;
}

Я действительно, когда я использую JPA для получения данных, я могу преобразовать этот DTO в Model, он будет примерно таким:

[Contact(name="John", phoneNumber="123")];

я использовал JPA вот так Список findDistinctByPhoneNumber (); но это ошибка,

и когда я использую

@Query("SELECT DISTINC new map(C.name as name, C.phoneNumber as phonenumber) from Contact C")
List<Contact> findDistnctByPhoneNumber();

результат такой [{name: "John", phone number:"123"}] это единственный массив объекта внутри этого массива, я очень хочу, чтобы вы получили модель, которая мне что-то вроде этого:

 [Contact(name="John", phoneNumber="123")];

1 Ответ

0 голосов
/ 20 июня 2019

Я полагаю, что ваша сущность выглядит следующим образом:

@Entity
@Table
public class Contact {
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    private Long id;
    private String name;
    private String phoneNumber;

    // constcutors && getters && setters
}

Репозиторий:

public interface ContactRepository extends JpaRepository<Contact, Long> {
}

Основной тест:

@SpringBootApplication
@EnableAutoConfiguration
public class ExampleH2Application {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(ExampleH2Application.class, args);
        ContactRepository contactRepository = context.getBean(ContactRepository.class);
        // save datas
        contactRepository.saveAndFlush(new Contact("John", "123"));
        contactRepository.saveAndFlush(new Contact("Dion", "123"));
        contactRepository.saveAndFlush(new Contact("Albert", "548"));

        List<Contact> res=new ArrayList<>();
        // group by phoneNumber then select max id -> recent
        Function<Contact, String> groupingComponent = Contact::getPhoneNumber;
        List<Contact> list = contactRepository.findAll();
        Collection<List<Contact>> collect = list.parallelStream().collect(Collectors.groupingBy(groupingComponent)).values();
        collect.parallelStream().filter(Objects::nonNull).forEach(e-> res.add(Collections.max(e, Comparator.comparing(Contact::getId))));
    }
}

Результат выглядит следующим образом:

[Контакт [id = 3, имя = Альберт, номер телефона = 548], Контакт [id = 2, имя = Дион, номер телефона = 123]]

NB: может быть, есть простой способ сделать это в nativeQuery, но я не эксперт в: (

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