如何区分 JPA Spring boot?

Posted

技术标签:

【中文标题】如何区分 JPA Spring boot?【英文标题】:how to Distinct in 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 【参考方案1】:

你有两个选择:

    编写原生查询:

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

    编写 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 方法名怎么样?我该怎么办

以上是关于如何区分 JPA Spring boot?的主要内容,如果未能解决你的问题,请参考以下文章

Spring+Hibernate+JPA的多数据库

spring boot + spring data jpa

如何在 Spring Data JPA 排序中定义空处理?

如何区分 Spring Rest Controller 中部分更新的 null 值和未提供的值

java学习之spring data jpa

带有 ApplicationContext.xml、DAO 和 Service 的 Spring JPA 为 NULL