当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA中基于内部连接查询和接口的投影

於和志
2023-03-14

我正在使用Spring Data JPA运行MySql DB开发一个Spring MVC项目,其中有四个实体对象:旅行、费用、货币和基金。

下面是我的DB架构的可视化表示:

在ExpenseRepository接口中,我扩展了JpaRepository接口。

现在,我尝试运行一个本机SQL查询,在这里我将传递expenseId,并从费用表中获取费用和金额,从货币表中获取currency_name。(您可以看到,我必须执行两个内部联接才能获得currency_name。)

package com.binarycraftbd.ksktravelbackend.Repo

import com.binarycraftbd.ksktravelbackend.JoinQueries.ExpenseData
import com.binarycraftbd.ksktravelbackend.Model.Expense
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query

interface ExpenseRepo : JpaRepository<Expense, Int> {


    @Query("select expense, amount from expense, currencyName from currency inner join fund on expense.fund_id=fund.id inner join currency on fund.currency_id=currency.id where expense.id=?1", nativeQuery = true)
    fun getCurrencyByExpId(expId:Int): ExpenseOutput

    interface ExpenseOutput{
        fun getExpense():String
        fun getAmount(): String
        fun getCurrencyname(): String
    }
}
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sat Sep 22 20:51:25 BDT 2018
There was an unexpected error (type=Internal Server Error, status=500).
could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
@Entity
@Table(name = "travel")
class Travel(
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        val id: Int=0,
        val travelName: String="",

        @OneToMany(mappedBy = "travel")
        @JsonIgnore
        val funds: List<Fund> ?= null,

        @OneToMany(mappedBy = "travel")
        @JsonIgnore
        val expenses: List<Expense>?=null

)
@Entity
@Table(name = "currency")
class Currency(

        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        val id: Int=0,
        val currencyName: String="",

        @OneToMany(mappedBy = "currency")
        @JsonIgnore
        val funds: List<Fund>?=null
)
@Entity
class Fund(
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        val id:Int=0,
        val fundName:String="",

        @OneToMany(mappedBy = "fund")
        @JsonIgnore
        val expenses: List<Expense>?= null,

        @ManyToOne
        val travel: Travel?=null,

        @ManyToOne
        val currency:Currency?=null
)

费用类别

@Entity
class Expense(


        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        val id:Int=0,
        val date:String="",
        val time:String="",
        val expense:String="",
        val amount:String="",
        val category:String="",

        @ManyToOne
        val travel: Travel?=null,

        @ManyToOne
        val fund: Fund?=null
)

如何解决这个问题?在ExpenserePository中编写查询代码是不正确的吗?还是Sql查询有问题?皮斯救命!!

共有1个答案

松钟展
2023-03-14

Econ尝试在任何sql客户机中运行这个查询,例如,在将它嵌入到代码中之前。

我像下面一样重写了上面的查询,我发现了一些语法错误和非逻辑的东西。

select expense.expense, expense.amount, currency.currency_name  
from expense inner join fund on (expense.fund_id=fund.id)
inner join currency on (fund.currency_id=currency.id)
where expense.id=<replace this segment with a valid expenseId>
 类似资料:
  • 我有两个联合查询,如下所示: 现在,我想在另一个查询中使用此联合。 当我运行它时,我得到ORA-00904:"P"."CUSTOMER_NO":无效的标识符。我需要将h1.customer_no加入到外部查询customer_no。 我看到过一些带有rank的查询,但我不太明白。如何将内部查询与外部查询连接起来? 提前感谢。

  • 在我发布配置之后,当我执行HTTP curl时,状态是。在worker的日志中也没有错误日志,当我检查它时,在kafka主题中也没有数据。当我尝试做一个控制台-消费者时,我还尝试了其他几种组合,比如在。 我尝试的另一件事是使用这两个链接https://rmoff.net/2018/05/21/kafka-connect-and-oracle-data-types/https://www.confl

  • 我有两个数据帧df1和df2。 i、 e.df1的索引为天,df2的索引为日期时间。我想在索引上执行DF1和DF2的内部连接,这样如果DF2中对应于DF2的时间在DF1中可用,则我们认为内部连接为真,否则为假。 我想获得两个df11和df22作为输出. df11将有共同的日期和相应的列从df1. df22将有共同的日期小时和相应的列从df2. "例如df1中的"2002-08-04"和df2中的"

  • 我有一个使用TypeORM包与Postgres SQL交互的nestjs应用程序。 我有下面的代码, 对于键和用户实体,我需要将内部连接创建为 选择*FROM key INNER JOIN user ON key.id=user.“keyid”,其中user.“userid”=1; 如何使用typeorm编写等效的内部联接查询? 如何使用typeorm执行上面的SQL查询?

  • 问题内容: 我绝对是SQL的新手,我一直在努力用Postgresql中的以下表结构编写一个复杂的查询: 查询的目的是获取每个用户的报告类型数量,并将其显示在一列中。有三种不同类型的报告。 使用group-by的简单查询将解决问题,但将其显示在不同的行中: 问题答案:

  • 我的架构如下所示: 这是你的小提琴 图式的快速解释:我有广告: 每个广告都有洞察力,这些洞察力告诉我们某个广告何时处于活动状态(=>ad_clicks必须>0)。 每个ad都有产品(MANY2MONE-表)。每个产品都有,它告诉我们该产品在某一天产生了多少销售额。 现在,我想获取时间范围-的所有广告,这些广告的>0(我已经做了),并计算每个广告在活动时产生了多少销售额。因此,只有当广告的ad_in