【发布时间】: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<Room>,但我可以在findAllProjectedBy()中返回List<RoomList>或任何我想要的。 -
你有
RoomType作为interface和class,你考虑过改变它吗。 -
RoomType内部接口是 spring data jpa 需要用于嵌套投影,所有配置都是正确的。
标签: hibernate spring-data-jpa projection