使用ms sql server查询OneTONE映射需要8秒以上的时间
我正在使用MS SQL server和jpa存储库 我想连接两个表并获取前20列,我在实体类中使用了注释 我使用的是Jpa存储库的findAll(Pageable),它生成查询10次,耗时10秒,这是非常巨大的 如果我在Db中搜索相同的内容,需要277毫秒使用ms sql server查询OneTONE映射需要8秒以上的时间,sql,hibernate,jpa,spring-data-jpa,Sql,Hibernate,Jpa,Spring Data Jpa,我正在使用MS SQL server和jpa存储库 我想连接两个表并获取前20列,我在实体类中使用了注释 我使用的是Jpa存储库的findAll(Pageable),它生成查询10次,耗时10秒,这是非常巨大的 如果我在Db中搜索相同的内容,需要277毫秒 @Getter @Setter @ToString @Entity @Table(name = "TVSource") public class MyTelevisionSource { @Id private Long So
@Getter
@Setter
@ToString
@Entity
@Table(name = "TVSource")
public class MyTelevisionSource {
@Id
private Long SourceId;
@Column(columnDefinition = "nvarchar2 (2000)")
private String LongName;
@Column(columnDefinition = "nvarchar2 (2000)")
private String DisplayName;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "SourceId")
private RCMSource rcmSource;
}
@Getter
@Setter
@ToString
@Entity
@Table(name = "Source")
public class RCMSource {
@Id
private Long SourceId;
@Column(columnDefinition = "nvarchar2 (2000)")
private String SourceName;
}
@Service
public class TelevisionSourceService {
@Autowired
private TelevisionSourceRepository televisionSourceRepo;
public List<MyTelevisionSource> getTelevisionSource(){
Pageable pageable = PageRequest.of(0, 10);
Page<MyTelevisionSource> tvSource = televisionSourceRepo.findAll(pageable);
System.out.println(tvSource.getContent());
return tvSource.getContent();
}
public interface TelevisionSourceRepository extends JpaRepository<MyTelevisionSource, Long> {
Page<MyTelevisionSource> findAll(Pageable pageable);
}
@Getter
@塞特
@托斯特林
@实体
@表(name=“TVSource”)
公共类MyTelevisionSource{
@身份证
私有长源ID;
@列(columnDefinition=“nvarchar2(2000)”)
私有字符串LongName;
@列(columnDefinition=“nvarchar2(2000)”)
私有字符串显示名;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name=“SourceId”)
私有RCMSource RCMSource;
}
@吸气剂
@塞特
@托斯特林
@实体
@表(name=“Source”)
公共类RCMSource{
@身份证
私有长源ID;
@列(columnDefinition=“nvarchar2(2000)”)
私有字符串源名称;
}
@服务
公共类电视资源服务{
@自动连线
私人电视资源私人电视资源;
公共列表getTelevisionSource(){
Pageable Pageable=PageRequest.of(0,10);
页面tvSource=电视资源po.findAll(可分页);
System.out.println(tvSource.getContent());
返回tvSource.getContent();
}
公共界面电视资源库扩展了JpaRepository{
页面findAll(可分页可分页);
}
我使用自定义查询,如下所示 @查询(“从源的内部连接中选择s.sourceid,s.sourceName,其中t.sourceid=:sourceid”)
Page findAll(可分页);
但这是一个错误
原因:org.hibernate.hql.internal.ast.QuerySyntaxException:源未映射[从源中选择s.sourceid、s.sourceName、t.TvsourceLongName作为s内部连接电视源作为s.sourceid=t.sourceid上的t]
不知道…为什么它会给出你真的需要懒散吗(OneToOne注释的
FetchType.LAZY
)?正因为如此,你有1个主要查询来检索你的电视源,然后有10个查询来检索RCM源。
如果您设置了
FetchType.EAGER
,它应该会生成一个带有左连接的查询您真的需要懒散吗(OneTONE注释的FetchType.LAZY
)?因此,您有1个主查询来检索电视源,然后有10个查询来检索RCM源。
如果设置
FetchType.EAGER
它应该生成一个带有左连接的查询我也尝试了下面的方法,@OneToOne(fetch=FetchType.EAGER)@JoinColumn(name=“SourceId”)私有RCMSource RCMSource;但没有变化…现在它也会像你说的那样生成11个查询。我是否遗漏了什么?我正在使用MS SQL Server我可能忘记了stg:add@Fetch(FetchMode.JOIN)
在RCMSource字段上应该强制JOIN我正在使用自定义查询,如下@Query(“从源s内部连接s.TelevisionSource t中选择s.sourceid,s.sourceName,其中t.sourceid=:sourceid”)页面findAll(可分页);但它的给定错误是由以下原因引起的:org.hibernate.hql.internal.ast.QuerySyntaxException:源未映射[选择s.sourceid、s.sourceName、t.TvsourceLongName FROM Source作为s内部加入电视源作为t ON s.sourceid=t.sourceid]不知道…为什么会出现这样的问题您在这里混合了不同的问题。您的findAll()如何除了pageable之外没有其他参数的方法使用:sourceid参数执行查询。在HQL/querys中,您必须使用实体名称,而不是表名称,因此RCMSource和not SourceI也尝试了以下方法@OneToOne(fetch=FetchType.EAGER)@JoinColumn(name=“sourceid”)private RCMSource RCMSource;但没有改变…现在它也会像你说的那样生成11个查询。我缺少什么吗?我正在使用MS SQL Server我可能忘记了stg:add@Fetch(FetchMode.JOIN)
在RCMSource字段上应该强制连接我正在使用自定义查询,如下@Query(“选择s.sourceid,s.sourceName from Source s internal join s.TelevisionSource t其中t.sourceid=:sourceid“)Page findAll(Pageable Pageable);但它的给定错误是由:org.hibernate.hql.internal.ast.querysyntaxception引起的:源未映射[选择s.sourceid、s.sourceName、t.TvsourceLongName FROM Source作为s内部加入电视源作为t ON s.sourceid=t.sourceid]不知道…为什么会出现这样的问题您在这里混合了不同的问题。您的findAll()如何除了pageable之外没有其他参数的方法使用:sourceid参数???执行查询,并且在HQL/querys中,必须使用实体名称,而不是表名称,因此RCMSource和not Source
Page<MyTelevisionSource> findAll(Pageable pageable);