【问题标题】:Spring boot, execute custom querySpring Boot,执行自定义查询
【发布时间】:2019-01-12 12:00:24
【问题描述】:

我是 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);
}

如果我们可以把那个复杂的查询(比如三个或更多的表)放在这里, 我们应该根据查询列创建一个新的实体类吗? 然后又是这项工作,因为实际上没有这样的桌子。

【问题讨论】:

  • 这太宽泛了。你需要学习 JPA、关联、JPQL。阅读 Hibernate 文档,或一本关于它的好书。
  • 非常感谢。那个“JPQL”提示真的很有帮助(我知道在哪里看)。先生,如果您可以推荐更多内容,请不胜感激。

标签: mysql spring spring-boot spring-data-jpa entity


【解决方案1】:

要从 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以防止结果重复记录,更多信息请参见here。)


有用的资源:

Spring Data JPA - Reference Documentation

SpEL support in Spring Data JPA @Query definitions

Hibernate ORM User Guide

JPQL Language Reference

【讨论】:

  • @is_sa91 不客气,但如果对您有帮助,请不要忘记接受/投票)
  • 是的.. 抱歉。 :)
猜你喜欢
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
相关资源
最近更新 更多