有啥比在 Java Spring Boot 中使用自定义查询更好的方法?

Posted

技术标签:

【中文标题】有啥比在 Java Spring Boot 中使用自定义查询更好的方法?【英文标题】:What is the better way than using customized query in Java Spring Boot?有什么比在 Java Spring Boot 中使用自定义查询更好的方法? 【发布时间】:2018-11-06 20:18:54 【问题描述】:

这是在我的 Service 包中用 Play 框架编写的:

public static BigInteger validUsername(JsonNode user)      

    Query query = JPA.em().createNativeQuery("SELECT COUNT(u.userId) FROM "+USER_TABLE+" u where username = ? and status != 'deleted'");
    query.setParameter(1, user.findPath("userName").asText());
    BigInteger count =  (BigInteger) query.getSingleResult();

return count;

有没有更好的方法在 Java Spring Boot 应用程序中实现相同的功能?

【问题讨论】:

Is it possible to use raw SQL within a Spring Repository的可能重复 status 列是 Postgres 枚举还是文本? 【参考方案1】:

为此,您可以使用 JPA 和 Spring Data JPA。这意味着您应该将表映射到实体,例如:

@Entity
@Table(name = "USER_TABLE")
public class User 
    @Id
    private Long userId;
    private String username;
    private String status;

    // Getters, setters, ...

之后,您可以使用 Spring Data JPA 编写存储库:

public interface UserRepository extends JPARepository<User, Long> 


这还允许您以多种方式编写自定义查询,例如使用 @Query 注释、查询方法等。

public interface UserRepository extends JPARepository<User, Long> 

    @Query("select count(u.userId) from User u where u.username = :username AND u.status != 'deleted'")
    int countNonDeletedUsersByUsername(@Param String username);

此查询使用 JPQL(JPA 的一种查询语言),但如果您更喜欢编写本机查询,您可以始终启用 nativeQuery 标志,如 the documentation 所述:

@Query 注释允许通过将nativeQuery 标志设置为true 来运行本机查询。

【讨论】:

【参考方案2】:

我可能会建议您使用 JPA 存储库。 HERE

您可能会发现很多如何实现它的示例。

简而言之,存储库中的方法应如下所示:

public interface CustomerRepository extends CrudRepository<Customer, Long> 

List<Customer> findByLastName(String lastName);

如果你想在例子中使用原生查询,你可以使用@Query注解并输入你的查询作为参数。

 @Query("SELECT t.title FROM Todo t where t.id = :id") 
String findTitleById(@Param("id") Long id);

【讨论】:

以上是关于有啥比在 Java Spring Boot 中使用自定义查询更好的方法?的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中有啥比 SqlDataReader 更快的吗?

这段代码有啥比 boost mutex 更快的吗?

有啥比 document.execCommand 更好的吗?

pytest 3.x 有啥比 2.x 重要的东西吗?

有啥比 dict() 更快的吗?

在 css 中有啥比 !important 更重要的吗?