我有一个合同,其中有2个不同的名称,但是具有相同的号码,我真的想只得到一个结果,尽管名字不同,但该电话号码会显示在我的结果中
示例,在我的数据库中,有一个名为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")];
答案 0 :(得分:0)
我想您的实体看起来像:
@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, name = Dion,phoneNumber = 123]]
注意:在nativeQuery中可能有一种简便的方法,但我不是:(