spring启动,执行自定义查询

c9qzyr3d  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(334)

我是网络开发的新手,我做了一些例子,比如从mysql数据库获取数据并在jsp页面中显示它们(使用crudepository),但是这样我们只能显示一个表数据。如果要显示合并两个表数据,应该怎么做。

我在搜索的时候发现了这些,我只是在问我们如何将一个更复杂的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);
}

如果我们可以把复杂的查询(比如三个或更多的表)放在这里,我们应该根据查询列创建一个新的实体类吗??再说一次,这是工作,因为实际上没有任何一张这样的table。

myss37ts

myss37ts1#

要从数据库中获取更复杂的数据,可以使用投影,例如:

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;
}

然后,您可以使用repository方法来获取用户及其角色数据,即使没有任何投影,也只针对主实体( 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 table。
(使用说明) distinct 在防止重复记录的查询中,更多信息请参见此处。)
有用资源:
spring数据jpa-参考文档
查询创建
存储库查询关键字
投影
spring数据jpa@query定义中的spel支持
hibernate orm用户指南
联想
hql和jpql
jpql语言参考

相关问题