spring data jpa本机查询与连接

rod*_*757 7 mysql hibernate jpa spring-data spring-data-jpa

如何在 spring data jpa 中执行本机查询,同时获取子实体?如果我在子实体对象上有 Eager FetchType,则 spring 数据正在执行 2 个查询。1 为父实体,1 为子实体。

有没有办法只执行 1 个本地查询来获取父实体和子实体?

家长:

@Entity
public class Parent {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;

   @Temporal(TemporalType.TIMESTAMP)
   private Date ts;

   @ManyToOne(fetch=FetchType.LAZY)
   private Child child;
}
Run Code Online (Sandbox Code Playgroud)

孩子:

@Entity
public class Child {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;

   @OneToMany(fetch=FetchType.LAZY, mappedBy="parent")
   private Parent parent;
}
Run Code Online (Sandbox Code Playgroud)

询问:

public interface ParentRepository extends Repository<Parent, Integer> {
    @Query(value = "SELECT * from parents p inner join children c on c.id=p.childId where TIMESTAMPDIFF(SECOND, p.ts, CURRENT_TIMESTAMP) < :interval", nativeQuery = true)
    Parent findOneByInterval(@Param("interval") long interval);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Hibernate 5、MySQL 和 Spring Data JPA。

我还尝试将 @NamedEntityGraph 添加到 Parent 类,并将 @EntityGraph 添加到查询方法,但没有成功。

小智 6

如果你想要父对象,你可以尝试这样

public interface ParentRepository extends Repository<Parent, Integer> {

    @Query(value = "SELECT p.* from parents p inner join children c on c.id=p.childId where TIMESTAMPDIFF(SECOND, p.ts, CURRENT_TIMESTAMP) < :interval", nativeQuery = true)
    Parent findOneByInterval(@Param("interval") long interval);
}
Run Code Online (Sandbox Code Playgroud)

(或者)Spring data JPA 将返回本机查询的对象数组,因此,

public interface ParentRepository extends Repository<Parent, Integer> {

    @Query(value = "SELECT * from parents p inner join children c on c.id=p.childId where TIMESTAMPDIFF(SECOND, p.ts, CURRENT_TIMESTAMP) < :interval", nativeQuery = true)
    List<Object[]> findOneByInterval(@Param("interval") long interval);
}
Run Code Online (Sandbox Code Playgroud)

  • 第二个查询工作正常。但需要自己映射对象。 (2认同)
  • 第一个查询应该是“SELECT * fromParents pinner join Children c on c.id=p.childId where TIMESTAMPDIFF(SECOND, p.ts, CURRENT_TIMESTAMP) &lt; :interval”,因为这是一个本机查询 (2认同)