Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ms sql server查询OneTONE映射需要8秒以上的时间_Sql_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

使用ms sql server查询OneTONE映射需要8秒以上的时间

使用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

我正在使用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 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);