如何区分 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 Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题
Spring Boot / JPA / Hibernate,如何根据 Spring 配置文件切换数据库供应商?
如何使用 jpa/spring-boot 正确应用类似 PrePersist 的逻辑