比在Java Spring Boot中使用自定义查询更好的方法是什么?

问题描述 投票:-3回答:2

这是在我的服务包中的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
2个回答
2
投票

为此,您可以使用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来运行本机查询。


1
投票

我可能会建议您使用JPA Repository。 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);
© www.soinside.com 2019 - 2024. All rights reserved.