Я работаю над проектом Spring MVC с Spring Data JPA под управлением MySql DB, где у меня есть четыре объекта сущности: командировка, расходы, валюта и фонд.
Вот визуальное представление моей схемы БД:
В интерфейсе ExpenseRepository я расширил интерфейс JpaRepository.
Теперь я пытаюсь запустить собственный SQL-запрос, в котором я передам параметр CostId, а я получу данные о расходах и суммах из таблицы «Расходы» и имя_валюты из таблицы валют.(Вы можете видеть, что мне нужно сделать два внутренних соединения, чтобы получить имя_валюты.)
наконец, я создал еще один интерфейс ExpenseOutput для объединения трех столбцов в отдельный не-сущностный интерфейс (в соответствии с отображением проекции на основе интерфейсаупоминается в документации JPA Spring Data).
Вот коды:
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
}
}
Однако, когда я запускаю код через функцию RestController, я получаю следующую ошибку:
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?Pease HELP !!