【发布时间】:2017-10-28 16:58:29
【问题描述】:
我有一个与 mySQL db 连接的简单 spring boot rest 应用程序,我正在尝试优化简单函数中的查询数量:
List<Message> messages = messagesRepository.findBySenderIdOrReceiverIdOrderByTimeDesc(senderId, receiverId);
MessagesRepository:
public interface MessagesRepository extends CrudRepository<Message, Long> {
List<Message> findBySenderIdOrReceiverIdOrderByTimeDesc(Long senderId, Long receiverId);
}
消息:
@Entity
@Table(name="s_messages")
public class Message implements Serializable
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Transient
private int internalId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="senderId", referencedColumnName = "id", updatable=false, insertable=false)
private ProfileLite sender;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="receiverId", referencedColumnName = "id", updatable=false, insertable=false)
private ProfileLite receiver;
@Column(columnDefinition="TEXT")
private String message;
private long time;
private MessageStatus status;
}
ProfileLite:
@Entity
@Table(name="s_profiles")
public class ProfileLite implements Comparable<ProfileLite>
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String nickname;
private String country;
private String thumb;
private Gender gender;
}
执行上述方法后,hibernate 会生成大约 40 个 SQL(基于 40 个配置文件),如下所示:
所以首先收集消息,然后为每条消息创建另一个 sql 来收集配置文件。
是否有可能推动 hibernate 只创建一个简单的 sql 而不是 40 个,例如:select * from s_messages m join s_profiles s1 on m.sender_id = s1.id join s_profiles s2 m_receiver_id = s2.id ?(伪代码)
谢谢!
【问题讨论】:
标签: java mysql hibernate jpa spring-boot