【问题标题】:how to Distinct in JPA Spring boot?如何区分 JPA Spring boot?
【发布时间】:2019-11-03 00:09:22
【问题描述】:

如何在 JPA 中使用 distinct?因为我想在我的表中获取所有电话号码和姓名,所以我通过唯一获得所有结果,我在一个名为 whatsapp_chat 的数据库中的表名,我想通过 wa_id(我的字段数据库)获得所有结果

我试过 Lits findDistincByWhatsappid() , Lits findDistincWhatsappid(); 我得到了使用它们的错误,如何纠正使用 Distinct 的方法?我是 Spring Boot 和 Java 新手

我也试过这个:

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

hee 是我的实体/模型:

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;

}

【问题讨论】:

  • 你能添加你的实体类吗?
  • 正如@Arnaud 所说,添加代码、错误消息以及您拥有的 StackTrace
  • 我确实创建了实体@Arnaud

标签: java spring-boot spring-mvc jpa


【解决方案1】:

你有两个选择:

  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());
    }
}

【讨论】:

  • 所以方法名称是 custum 和我们喜欢的任何名称??
  • 是的,该方法仅在您没有 Query 注释时才重要。
  • 列表中的那个怎么样?我可以在字符串上使用域吗?因为我想从数据库中获取该域中的所有数据
  • 你不能@poppop。您最终会遇到转换器问题,因为您正在检索一列并尝试转换为整个对象类型。
  • 当我把字符串放在上面时,它显示错误,当我在其中使用域时,它没有错误,我得到了结果,但结果现在显示 DTO,只是数组中的字符串跨度>
【解决方案2】:

您可以使用它而不是您正在使用的那个,在您将 nativeQuery 字段设置为 true 之前,您不能直接在 jpa 的查询中使用该列。使用这个

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

【讨论】:

  • 我们不能在列表中使用 WhatsappChat 域吗??
【解决方案3】:

如下操作:

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

【讨论】:

    【解决方案4】:

    这是一个 HQL 查询,而不是原生查询,因此它使用实体的类名及其字段名。

    考虑将您的查询改写为:

    "SELECT DISTINCT whatsappid FROM WhatsappChat"

    【讨论】:

    • List 方法名怎么样?我该怎么办
    猜你喜欢
    • 2017-11-29
    • 2019-02-21
    • 1970-01-01
    • 2017-05-27
    • 2017-09-17
    • 2018-07-10
    • 1970-01-01
    • 2021-11-11
    • 2018-11-13
    相关资源
    最近更新 更多