Inner Join запрос и интерфейс на основе проекции в Spring Data JPA - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над проектом Spring MVC с Spring Data JPA под управлением MySql DB, где у меня есть четыре объекта сущности: командировка, расходы, валюта и фонд.

Вот визуальное представление моей схемы БД:

enter image description here

В интерфейсе 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 !!

1 Ответ

0 голосов
/ 22 сентября 2018

Econ попытаться выполнить этот запрос в любом клиенте sql, например, в mysql workbench, прежде чем встраивать его в код.

Я переписываю запрос выше, как показано ниже, я обнаружил некоторые синтаксические ошибки и нелогичные вещи.

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...