mysql - Spring Boot,执行自定义查询
问题描述
我是 Web 开发的新手,我做了一些示例,例如从 mysql db 获取数据并在 jsp 页面中显示它们。(使用 CRUDRepository )但这样我们只能显示一个表数据。如果我们想显示两个表数据的组合,我们应该怎么做。
我在搜索时发现了这些,只是我在问我们如何对此进行更复杂的 sql 查询。
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.lastname like ?1%")
List<User> findByAndSort(String lastname, Sort sort);
@Query("select u.id, LENGTH(u.firstname) as fn_len from User u where u.lastname like ?1%")
List<Object[]> findByAsArrayAndSort(String lastname, Sort sort);
}
如果我们可以把那个复杂的查询(比如三个表或更多)放在这里,我们是否应该根据查询列创建一个新的实体类??然后又是这项工作,因为实际上没有这样的桌子。
解决方案
要从 DB 中获取更复杂的数据,您可以使用projections,例如:
public interface UserProjection {
Long getId();
Long getFirstNameLen();
}
@Query("select u.id as id, LENGTH(u.firstName) as firstNameLen from User u where u.lastname like ?1%")
List<UserProjection> getProjections(String lastName, Sort sort);
请注意,您应该在查询中使用必须与投影中的 getter 匹配的别名 ( ... as firstNameLen
-> getFirstNameLen()
)
与您可以从多个(连接的)实体获取数据的方式相同。
如果您有一个具有某些关联的实体,例如:
@Entity
public class User {
//...
@OneToMany
private List<Role> roles;
}
那么即使没有任何投影,您也可以使用存储库方法获取用户及其角色数据,仅用于主实体(User
)。然后 Spring 自己完成剩下的工作:
@EntityGraph(attributePaths = "roles")
List<User> findByFirstNameContainingIgnoreCase(String firstName);
或与查询相同:
@Query("select distinct u from User u left join fetch u.roles where upper(p.firstName) like concat('%', upper(?1), '%')")
List<User> findWithQuery(String firstName);
在这种情况下,所有用户的角色列表都将填充roles
表中的数据。
(注意distinct
在查询中使用以防止重复记录的结果,更多信息请参见此处。)
有用的资源:
推荐阅读
- php - 结合 SQL 查询以提高效率
- javascript - 如何将网站 javascript 值转换为 python 变量?
- c++ - 我正在使用 OOPS 概念编写代码,但我收到有关私有访问说明符的错误,尽管我在类中访问它
- android - 在嵌套片段中打开键盘时,BottomSheet 中出现超级奇怪的故障
- batch-file - 为什么这个 Windows 终端批处理文件会打开一个额外的选项卡?
- javascript - Firestore onSnapshot "IN" 批量条件(有条件的实时更新)
- google-apps-script - 如何解决 Oauth2 回调错误:无法读取未定义 Service_.handleCallback 的属性“参数”
- nginx - nginx 代理管理器 502 登录时网关错误
- python - 如何设置一个while循环,直到列表在Python中停止变化?
- flutter - 为什么“StateNotifierProvider + Consumer”不重建小部件?