98彩票-如何使用JPA优化对数据库的查询

作者:98彩票 时间:2019-04-23 09:58

字号

您将看到不同类型的查询,98彩票网解释如何在惰性急切之间建立连接这些表将由单个字段连接,由几个甚至一个连接,但添加静态条件。

示例项目是在Spring Boot with Hibernate中  使用H2作为数据库开发的。

您可以在文件中找到表的定义schema.sql测试数据加载到data.sql文件中。

这是数据库的架构:

图片标题

在那种情况下,我不会解释代码,因为它与我在其他条目中详细解释的其他程序非常相似。您可以在http://www.profesor-p.com(西班牙语)中找到其他示例我将重点介绍如何在程序中执行不同的查询。

解释性说明: 如果Java类中的实体或列的名称之间有一个大写字母,JPA将解释中间有一个连字符,它将是它将在中查找的表或列。数据库。这样,如果  Invoiceheader.java  该类被重命名为  InvoiceHeader.java  Hibernate,它将 在数据库中查找invoice_header表,并且它将失败,因为它找不到它。例如,您可以使用lineDetails变量调用invoiceDetails表中的 invoice_details字段,该 表位于 Invoicedetails.java类中(请注意D为小写) 

在invoiceHeader表和customer表之间执行“ select join ”

  • 懒人链接

如果要在发票标题实体中包含客户实体的字段,则必须在“Invoiceheader.java”类中添加此行。

 
@ManyToOne= FetchTypeLAZY
 
@JoinColumnname = “customerid”referencedColumnName = “id”
 
客户 客户 ;
 

执行搜索时,生成的查询将是:

 
选择
 
        invoicehea0_id   id1_3_0_
 
        invoicehea0_customerid  as  customer2_3_0_
 
        invoicehea0_fiscalyear  as  fiscalye3_3_0_
 
        invoicehea0_numberinvoice  as  numberin4_3_0_ 
 
    
 
        invoiceheader  invoicehea0_ 
 
    哪里
 
        invoicehea0_id =?
 

当您读取现场客户 的价值时,将执行查询客户数据的新查询:

 
 选择
 
        customer0_id   id1_1_0_
 
        customer0_活跃  active2_1_0_
 
        customer0_地址  address3_1_0_
 
        customer0_名称  name4_1_0_ 
 
    
 
        客户 customer0_ 
 
    哪里
 
        customer0_id =?
 
  • 链接
 
@ManyToOne= FetchType磨边机
 
@JoinColumnname = “customerid”referencedColumnName = “id”
 
客户 客户 ;
 

由于搜索类型设置为FetchType.EDGER,因此使用相应的左外连接进行单个选择

 
 选择
 
        invoicehea0_id   id1_3_0_
 
        invoicehea0_customerid  as  customer2_3_0_
 
        invoicehea0_fiscalyear  as  fiscalye3_3_0_
 
        invoicehea0_numberinvoice   numberin4_3_0_
 
        customer1_id   id1_1_1_
 
        customer1_活跃  active2_1_1_
 
        customer1_地址  address3_1_1_
 
        customer1_名称  name4_1_1_ 
 
    
 
        invoiceheader  invoicehea0_ 
 
      连接
 
        客户 customer1_ 
 
             invoicehea0_上customerid = customer1_ID 
 
    哪里
 
        invoicehea0_id =?
 
  • 卷曲卷曲。添加固定值

但是,如果我们想要将98彩票网两个表与一列链接并且在另一列中使用固定值,该怎么办?

customer表格中,定义活动列,我们希望它仅在该列的值为时显示发票的数据1为此,我们需要@JoinColumnsOrFormulas标记的帮助,该标记允许我们在两列之间建立连接,并为目标表的列建立值(在本例中为customer)。

 
@ManyToOne= FetchType磨边机
 
@JoinColumnsOrFormulas({
 
 @JoinColumnOrFormulacolumn = @JoinColumnname = “customerid”referencedColumnName  = “id”)),
 
 @JoinColumnOrFormulaformula  =  @JoinFormulavalue = “1”referencedColumnName  =  “active”))
 
})
 
客户 客户 ;
 

执行的查询将是:

 
选择
 
        invoicehea0_id   id1_3_0_
 
        invoicehea0_customerid  as  customer2_3_0_
 
        invoicehea0_fiscalyear  as  fiscalye3_3_0_
 
        invoicehea0_numberinvoice   numberin4_3_0_
 
        1   公式1_0_
 
        customer1_id   id1_1_1_
 
        customer1_活跃  active2_1_1_
 
        customer1_地址  address3_1_1_
 
        customer1_名称  name4_1_1_ 
 
    
 
        invoiceheader  invoicehea0_ 
 
      连接
 
        客户 customer1_ 
 
             invoicehea0_上customerid = customer1_ID 
 
             1 = customer1_活性 
 
    哪里
 
        invoicehea0_id =?
 

如果您没有找到任何记录,则customer变量将具有空值。

如果链接类型是惰性的,如前一种情况那样,将在invoiceheader进行查询,并且当请求customer变量的值时,将在其相应的表上执行。

链接标题发票和发票行实体

要加入这两个表,我们将在类中添加以下代码 Invoicedetails.java

 
@OneToMany
 
@JoinColumns
 
    {
 
        @JoinColumnname = “fiscalyear”referencedColumnName = “fiscalyear”),
 
       @JoinColumnname = “numberinvoice”referencedColumnName = “numberinvoice”
 
    }
 
 
@OrderBy“linea desc”
 
列表< Invoicedetails >  详细信息 ;
 

如您所见,由于有两个字段连接两个表,我们将使用@JoinColumns标记及其对应的。

你看到奇怪的东西吗?这些线从最高到最低排序(第一行2,然后第一行)。显然,这是由于标签,我们必须强调两件事:

 
@OrderBy“linea desc”
 

 

  • 我们引用的字段是它在实体中的命名方式。因此,虽然在数据库中它被称为lineaDetails,但它由标签linea引用这是变量的命名方式
 
 @Columnname  =  “lineaDetails”
 
 int  line ;  //有意设置大写的'D'来映射字段linea_details
 
  • 在查询中,这使得数据库不会输入“order by”子句。换句话说,正是hibernate本身对结果进行排序。当有数千条记录返回时,请将其考虑在内。

 

这显示了98彩票网建立联合类型的重要性,因为如果我们想象一个包含数千行(我不太可能知道)的发票,如果我们建立加入惰性的方法而不是对数据库进行单个查询,那么它将是1000,当然,除了不必要地重载数据库中的服务器之外,它会大大减慢我们的查询速度。

责任编辑:admin新闻报料:400-888-8888   本站原创,未经授权不得转载
关键词 >> 98彩票网,98彩票
继续阅读
热新闻

APP下载

客户端下载
推荐
关于我们 诚聘精英 联系我们 版权声明 友情链接 报料