簡體   English   中英

如何在JPA Spring啟動中與眾不同?

[英]how to Distinct in JPA Spring boot?

在JPA中如何使用distinct? 因為我想獲取表中的所有電話號碼和姓名,所以我通過unique來獲取所有結果,我的表​​名在名為whatsapp_chat的數據庫中,並且我想通過wa_id(我的字段數據庫)獲取

我試過Lits findDistincByWhatsappid(),Lits findDistincWhatsappid(); 使用它們時出現錯誤,如何正確使用Distinct? 我是Spring Boot和Java的新手

我也嘗試過這個:

@Query("SELECT DISTINCT wa_id FROM whatsapp_chat")
    List<String> findDistinctWhatsappid();

熙是我的實體/模型:

Entity
@Data
@Table(name = "WHATSAPP_CHAT")
@DynamicUpdate
public class WhatsappChat extends Base {
    @Column(name = "NAME")
    private String name;

    @Column(name = "WA_ID")
    private String whatsappid;

    @Column(name = "TEXT")
    private String text;

    @Column(name = "MESSAGE_ID")
    private String messageid;

    @Temporal(TemporalType.TIMESTAMP)
    private Date timestamp;

}

這是一個HQL查詢,而不是本機查詢,因此它使用實體的類名及其字段名。

考慮將查詢詞改寫為:

"SELECT DISTINCT whatsappid FROM WhatsappChat"

您有兩種選擇:

  1. 編寫本機查詢:

     @Query(value = "SELECT DISTINCT w.WA_ID FROM WHATSAPP_CHAT w", nativeQuery = true) List<String> findDistinctWhatsappIds(); 
  2. 編寫JPQL查詢(使用對象查詢):

     @Query("SELECT DISTINCT w.whatsappid FROM WhatsappChat AS w") List<String> findDistinctWhatsappIds(); 

無論哪種方式,我都將方法名稱更改為復數形式(它是一個列表),並在Id中將其大寫形式(列檢索)更改為確切知道它即將來臨。

注意:方法名稱對查詢本身沒有影響,因為它包含注釋@Query指定要執行的內容。

您可以對此進行測試(如果不使用Spring-boot,則有所不同):

@DataJpaTest
@RunWith(SpringRunner.class)
public class WhatsappChatRepositoryTest {

    @Autowired
    EntityManager entityManager;

    @Autowired
    WhatsappChatRepository whatsappChatRepository;

    @Before
    public void setup() {
        entityManager.persist(new WhatsappChat("whats1", "whats01", 1));
        entityManager.persist(new WhatsappChat("whats2", "whats02", 2));
        entityManager.persist(new WhatsappChat("whats3", "whats01", 3));
        entityManager.persist(new WhatsappChat("whats4", "whats04", 4));

        entityManager.flush();
    }

    @Test
    public void shouldTestSameResult() {
        assertEquals(whatsappChatRepository.findDistinctWhatsappIds(), whatsappChatRepository.findDistinctWhatsappIdsNative());

        assertEquals(Arrays.asList("whats01", "whats02", "whats04"), whatsappChatRepository.findDistinctWhatsappIds());
    }
}

遵循以下步驟:

@Query(value="SELECT DISTINCT WA_ID FROM WHATSAPP_CHAT", nativeQuery = true)
    List<String> findDistinctWhatsappid();

您可以使用此列而不是正在使用的列,除非將nativeQuery字段設置為true,否則無法直接在jpa的查詢中使用該列。 用這個

@Query(value = "SELECT DISTINCT W.whatsappid FROM WhatsappChat W")
List<String> findDistinctWhatsappid();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM