这是在我的服务包中的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应用程序中实现相同的功能?
为此,您可以使用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
来运行本机查询。
我可能会建议您使用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);