Как сделать пользовательский запрос с помощью Spring CrudRepository, использовать две или более сущностей с хранилищем - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть три объекта, и один репозиторий расширяет CrudRepository, и я хочу сделать следующий запрос, но я не могу.У меня есть синтаксическая ошибка в или около верхнего.Я думаю, что проблема заключается в использовании нескольких таблиц в запросе и / или я не использую какой-либо тег или объявление в объектах.

import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import com.companyname.springapp.business.entities.TableA;

public interface TableARepository extends CrudRepository<TableA, Integer>{

@Query(value = "SELECT DISTINCT a.*"
            +"FROM TableB AS b, TableA_TableB AS ab, TableA AS a"
            +"WHERE upper(b.nick_name) like upper(concat('%',:name,'%'))"
            +"AND b.nick_name_id=ab.nick_name_id"
            +"AND ab.id=a.id", 
              nativeQuery = true)
            List<tableA> test(
              @Param("name") String name);

Мои объекты:

TableA

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import com.companyname.springapp.web.Views;
import com.fasterxml.jackson.annotation.JsonView;


@Entity
@Table(name="TableA")
public class TableA{

    @Id
    @JsonView(Views.Public.class)
    private Integer id;

    //more columns, constructs and getters and setters

TableB

    //... imports
    @Entity
    @Table(name="TableB")
    public class TableB{

    @Id
    @JsonView(Views.Public.class)
    private Integer nick_name_id;

    @JsonView(Views.Public.class)
    private String nick_name;

    //more columns, constructs and getters and setters

TableA_TableB

    //... imports
    @Entity
    @Table(name="TableA_TableB")
    public class TableA_TableB{

    @Id
    @JsonView(Views.Public.class)
    private Integer id;

    @JsonView(Views.Public.class)
    private Integer nick_name_id;

    //more columns, constructs and getters and setters

У меня естьTableAManager

import java.util.List;

import com.companyname.springapp.business.entities.TableA;

public interface TableAManager {

    public List<TableA> test(String name);
}

реализация JPATableAManager

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.companyname.springapp.business.entities.TableA;
import com.companyname.springapp.business.repositories.TableARepository;

@Service
public class JPATableAManager implements TableAManager {

    @Autowired
    private TableARepository tableARepository;

    public List<TableA> getTableA() {
        return (List<TableA>) tableARepository.test();
    }

PD: извините, мой английский

1 Ответ

0 голосов
/ 22 февраля 2019

В вашем операторе SQL отсутствуют пробелы.

"SELECT DISTINCT a.*"
+"FROM TableB AS b, TableA_TableB AS ab, TableA AS a"
+"WHERE upper(b.nick_name) like upper(concat('%',:name,'%'))"
+"AND b.nick_name_id=ab.nick_name_id"
+"AND ab.id=a.id"

при объединении будет "SELECT DISTINCT a.*FROM TableB AS b, TableA_TableB AS ab, TableA AS aWHERE upper(b.nick_name) like upper(concat('%',:name,'%'))AND b.nick_name_id=ab.nick_name_idAND ab.id=a.id"

В результате aWhere станет псевдонимом для TableA, а предложение where - нетразобраться как таковой.

При построении операторов SQL таким способом заканчивайте каждую строку пробелом:

"SELECT DISTINCT a.* "
+"FROM TableB AS b, TableA_TableB AS ab, TableA AS a "
+"WHERE upper(b.nick_name) like upper(concat('%',:name,'%')) "
+"AND b.nick_name_id=ab.nick_name_id "
+"AND ab.id=a.id"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...