繁体   English   中英

如何从同一列中JPA中的相同值的列中获取sql中的唯一行?

[英]how to get unique row in sql from one column which same value in JPA?

我有一个合同,其中有2个不同的名称,但是具有相同的号码,我真的只想得到一个结果,尽管其名称不同,但该电话号码会显示在我的结果中

例如,在我的数据库中,我有一列名为name和phoneNumber:

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

我真的很想只得到一个只显示新结果且唯一的结果,我可以通过SELECT DISTINCT .....来实现它,所以我只能得到唯一的,我正在尝试SELECT DISTINCT name, phoneNumber FROM Contacts*

但是结果显示这些数据是因为它们具有不同的名称,我的结果实际上只显示了数据库中最新的数据

我有这样的DTO(DATA TRANSFER OBJECT)

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")];

我想您的实体看起来像:

@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,名称= Albert,电话号码= 548],联系人[id = 2,名称= Dion,电话号码= 123]]

注意:在nativeQuery中可能有一种简单的方法,但是我不是:(

暂无
暂无

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

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