【问题标题】: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 应用程序中实现相同的功能?

【问题讨论】:

标签: java spring-mvc spring-boot jpa playback


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 2019-02-16
      • 2020-11-12
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多