【问题标题】:spring jpa nested projection generating incorrect queryspring jpa嵌套投影生成不正确的查询
【发布时间】:2018-04-19 22:56:48
【问题描述】:

让我们考虑这些实体

@Entity
public class Room{

  @Id
  private Integer id;

  private String number;

  private String floor;

  @ManyToOne
  private RoomType roomType;

  // Setters & Getters  
}

@Entity
public class RoomType{

  @Id
  private Integer id;

  private String name;

  private String description;

  private Boolean enabled;

  // Setters & Getters  
}

还有这个与存储库类一起投影的接口

public interface RoomList{

    public Number getId();

    public String getNumber();

    public RoomType getRoomType();

    interface RoomType {
        String getName();
    }   

}

@Repository
public interface RoomRepository extends JpaRepository<Room,Integer>{

    public Collection<RoomList> findAllProjectedBy();

}

现在如果我查看生成的 SQL

select
    room0_.id as col_0_0_,
    room0_.number as col_1_0_,
    roomtype1_.id as id1_3_,
    roomtype1_.description as descript2_3_,
    roomtype1_.enabled as isActive3_3_,
    roomtype1_.name as name5_3_ 
from
    Room room0_ 
inner join
    roomType roomtype1_ 
        on room0_.roomType_id=roomtype1_.id

生成的查询应该是这样的

select
    room0_.id as col_0_0_,
    room0_.number as col_1_0_,
    roomtype1_.name as name5_3_ 
from
    Room room0_ 
inner join
    roomType roomtype1_ 
        on room0_.roomType_id=roomtype1_.id

有人可以解释这种行为还是这是一个错误?还有什么其他选择我们可以实现这种结果。我已经尝试过 JPA 实体图,但是休眠中尚未完全支持图形类型获取,我也不想使用构造函数 jpql 查询。谢谢!

【问题讨论】:

  • 你能分享findAllProjectedBy的定义吗?当您没有描述生成查询时您执行了哪些操作。
  • findAllProjectedBy() 的工作方式与findAll() 完全相同,只是我只能在findAll() 中返回List&lt;Room&gt;,但我可以在findAllProjectedBy() 中返回List&lt;RoomList&gt; 或任何我想要的。
  • 你有RoomType 作为interfaceclass,你考虑过改变它吗。
  • 我有RoomType 作为一个类,但不是一个接口。接口名称为RoomList,配置根据spring data jpa 参考文档link。嵌套投影需要edit RoomType 内部接口。
  • RoomType 内部接口是 spring data jpa 需要用于嵌套投影,所有配置都是正确的。

标签: hibernate spring-data-jpa projection


【解决方案1】:

如果理解正确,问题是选择的属性/列多于填充投影所需的数量。

正如我刚刚在 issue DATAJPA-1218 中描述的那样,这就是当前 Spring Data 中的预测工作方式。引用实体的属性不限于投影中使用的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 2020-08-27
    • 2018-12-16
    • 2021-06-19
    • 2021-08-28
    • 2020-01-10
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多