Java 使用spring boot对数据库的错误查询

Java 使用spring boot对数据库的错误查询,java,mysql,database,Java,Mysql,Database,我在API中的@query有一些问题。 在我的数据库中,我有一个表,有5列:id、imie、nazwisko、wiek、miasto 我试图对我的数据库进行自定义查询,现在我们开始->错误 当我做@Query时,比如: @Query(value = "SELECT * FROM osoba WHERE osoba.id = :id", nativeQuery = true) @Query(value = "SELECT imie FROM osoba WHERE osoba.id = :id

我在API中的@query有一些问题。 在我的数据库中,我有一个表,有5列:id、imie、nazwisko、wiek、miasto

我试图对我的数据库进行自定义查询,现在我们开始->错误

当我做@Query时,比如:

@Query(value = "SELECT * FROM osoba WHERE osoba.id = :id", nativeQuery = true)
@Query(value = "SELECT imie  FROM osoba WHERE osoba.id = :id", nativeQuery = true)
结果:

{
    "id": 1,
    "imie": "Szymon",
    "nazwisko": "Markowski",
    "wiek": 55,
    "miasto": "Sosnowiec"
}
知道吗,我正在尝试进行另一个查询,如:

@Query(value = "SELECT * FROM osoba WHERE osoba.id = :id", nativeQuery = true)
@Query(value = "SELECT imie  FROM osoba WHERE osoba.id = :id", nativeQuery = true)
我们开始吧。它使问题变得像:

2019-09-10 21:44:29.141 ERROR 8068 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'id' not found.
2019-09-10 21:44:29.158 ERROR 8068 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [SELECT imie  FROM osoba WHERE osoba.id = ?]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query] with root cause

有什么想法吗?

您的问题是存储库不知道您返回的列的类型以及如何将它们与您的实体匹配。首先,您需要更改自定义方法的返回类型,如下所示:

@Repository
public interface OsobaRepository extend JpaRepository<Osoba, Integer> {
   @Query(value = "SELECT imie FROM osoba WHERE osoba.id = :id", 
          nativeQuery = true) 
   String findNameById(@Param("id") int id);
}
@Service
public ServiceOsobaImpl implementation ServiceOsoba {

    private final OsobaRepository osobaRepository;     

    @Autowired
    public ServiceOsobaImpl(OsobaRepository osobaRepository) {
        this.osobaRepository = osobaRepository;
    }

    // your methods
    ...

    public Osoba findNameById(int id) {
        String name = osobaRepository.findNameById(id);

        Osoba osoba = new Osoba();
        osoba.setName(name);

        return osoba;
    }

}
还有另一个选项,当您使用一个字段创建简单的
OsobaDto
并使用它时(类似于previos选项):

两个选项的响应都将是json格式。当然,如果在控制器方法上方指定
products=MediaType.APPLICATION\u JSON\u VALUE
(或自己的类似变体)

更新。 如果您使用了
Osoba
类并且不想看到
null
值,请执行以下操作。 创建新界面:

public interface OnlyName {}
下一步是将实体标记为
@Validated
,并将字段
imie
注释为
@JsonView

@Entity
@Validated
public class Osoba {

   // your code

   @JsonView(OnlyName.class)
   private String imie;

}
以及控制器:

@RestController
@RequestMapping("/api/osoba")
public class OsobaAPI {

    @Autowired
    private OsobaRepo osobaRepo;

    @JsonView(OnlyName.class)
    @PostMapping
    @RequestMapping("/getID")
    public Osoba findOsobaById(@RequestParam("id") int id){
        String name = osobaRepo.findNameById(id);
        Osoba osoba = new Osoba();
        osoba.setImie(name);
        return osoba;
    }
}

我确实像你说的那样,我有这样的东西:

@Repository
public interface OsobaRepo extends CrudRepository<Osoba, Integer> {

    @Query(value = "SELECT imie FROM osoba WHERE osoba.id = :id", nativeQuery = true)
    String findNameById(@Param("id") int id);

}


邮递员的理由是:

{
    "id": 0,
    "imie": "Szymon",
    "nazwisko": null,
    "wiek": 0,
    "miasto": null
}
但我想从这个疑问中找到原因

{
    "imie": "Szymon",
}
编辑:

关于这个话题还有一个问题。 如果我想得到JSON的响应,比如:“imie,“nazwisko”? 我不能使用:



如果是字符串,则会导致响应。当我这样做时,我得到:

{
    "imie": null,
    "nazwisko": "IMIE, NAZWISKO"
}

也许我应该在这里使用String[]或创建只包含这两个属性的新类?

您是否尝试过
osoba.imie
id
列添加到select:
select id,imie FROM osoba,其中id=:id
@我执行您所说的操作时的handfnod“未找到miasto”列。“:D我不知道为什么我用‘miasto’会出错,因为我不使用它here@YCF_L您的命题有错误:找不到列“id”。@Szymon您是否在方法的
id
参数上添加了
@Param(“id”)
?默认情况下,我认为只有基于位置的参数(如
?1
)才是应该的。是的,这就是我的意思。如果您不想看到
null
值,请使用专用数据传输对象类(
OsobaDto
,在下面的示例中有一个字段)或使用注释
@NotNull
@null
,配置您的实体,
@Valid
@JsonView
等。乐意帮忙,请选择我的答案
    @Query(value = "SELECT imie, nazwisko FROM osoba WHERE osoba.id = :id", nativeQuery = true)
    String findNameById(@Param("id") int id);

}
{
    "imie": null,
    "nazwisko": "IMIE, NAZWISKO"
}