【发布时间】:2017-08-19 15:43:17
【问题描述】:
我有数据库架构
CREATE TABLE IF NOT EXISTS `offers` (
`id` int(11) NOT NULL,
`detail` varchar(255) NOT NULL
`status` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `restaurants` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`status` varchar(255) NOT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `rest_offer_map` (
`id` int(11) NOT NULL,
`rest_id` int(11) NOT NULL,
`offer_id` int(11) NOT NULL
`status` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
实体为
餐厅
@Id
@GeneratedValue
@Column(name="id")
private long id;
@Column(name="name")
private String name;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="rest_offer_map",
joinColumns={@JoinColumn(name="rest_id", referencedColumnName="id")},
inverseJoinColumns={@JoinColumn(name="offer_id",referencedColumnName="id")}
)
private List<Offers> offer;
优惠
@Id
@GeneratedValue
@Column(name="id")
private long id;
@Column(name="detail")
private String detail;
@JsonIgnore
@ManyToMany(mappedBy="offer")
private List<Restaurants> restaurants;
现在我想编写 JPA Repo 函数来获取有关特定餐厅的信息(在这种情况下是 ONLY NAME 但不是餐厅)。如何在不编写任何查询的情况下使用 JPA 函数获得此功能,我已使用此功能完成此操作:
@Query(value = "select name from Restaurants where id = ?1")
public String findById1(long id);
但是a)我不想在这个中使用查询。
还可以说,除了名称之外,还有其他属性,如员工人数、评级等。然后如何在不获得报价的情况下获得所有内容。我的意思是,如果我使用 findOne,那么它也会获得报价,因此它会运行一个额外的查询,这是我不想要的,而且也没有使用 @Query。(如果可能的话)。
附: - 我试图避免使用@Query,因为我认为这将是性能开销,因为 JPA(Hibernate) 需要额外的努力才能将其映射到 编译时/运行时(不确定)
【问题讨论】:
-
是什么让您认为没有
@Query就没有开销?如果你只是写select name from restaurant,Hibernate 不会为你构造一个Restaurant实体 -
并且,
Restaurant.offers不会有“额外查询”,因为您已将其延迟获取。
标签: hibernate jpa spring-boot