【问题标题】:Can I write my own Queries in a Spring boot web app?我可以在 Spring Boot Web 应用程序中编写自己的查询吗?
【发布时间】:2019-04-10 13:14:11
【问题描述】:

我正在制作我的第一个 springboot 网络应用程序,并尝试显示来自 postgresql 服务器的一些信息。当试图从数据库中获取一些信息时,它返回一个空列表。根据我在控制台中看到的,它会尝试使用错误的参数进行查询。

在我的数据库中,我有一个包含三个字段的表:“userId”、“firstName”和“surName”。 据我了解,Hibernate 尝试使用参数“users0_.user_id”、“users0_user_id”、“users0_.sur_name”进行查询。

要解决此问题,我想编写自己的查询或修复当前查询。我该怎么做?

如您所见,我已经使用一些 System.Out.print 语句检查了查询结果。

第一个返回的 list.size() 为 0, 第二个返回 null 值。

Console displaying what I think is the query info

这是我的 UserController 类中用于显示用户信息的函数。

    @RequestMapping("/users")
    public String getUsers(Model model) {
        List <users>users = (List<users>) userServ.listAll();
        System.out.print("THE SIZE WITH STRING CONCATINATION IS: " + users.size());
        model.addAttribute("users", users);
        System.out.print("THE NAME OF USER WITH INDEX =2 IS: " + userServ.getById(2).getFirstName());

        return "showUsers";
    }

用户的实体/域类:

@Entity
@Table(name="users")
public class users implements Serializable{


    @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
    private long userId;
    private String firstName;
    private String surName;

    private long getId() { return userId; }
    public void setId(long id) {this.userId = id;}
    public String getFirstName() { return firstName; }
    public String getSurName() { return surName; }
    public void setSurname(String surName) {this.surName = surName; }


}

这是用于从数据库中检索用户的存储库接口:

import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.repository.CrudRepository;

import com.svein.models.users;

public interface UserRepository extends CrudRepository<users, Long> {

}

这是用户的服务类:



@Service
public class UserServiceImp implements userService{

    @Autowired
    private UserRepository userRepo;

    @Override
    public List<users> listAll() {
        List<users> users = new ArrayList<>();
        userRepo.findAll().forEach(users::add);
        return users;
    }

    @Override
    public users getById(long id) {
        return userRepo.findById(id).orElseGet(users::new);
    }

    @Override
    public users saveOrUpdate(users user) {
        userRepo.save(user);
        return null;
    }

    @Override
    public void delete(Long id) {
        userRepo.deleteById(id);

    }


}

我希望调整或替换当前查询,但代码可能还有问题。正如我所说,我对此很陌生,但我认为我没有编写一行 SQL 并且在另一个项目中显示出检索正确信息的迹象(来自不同的数据库),这很奇怪。类如何知道要查询什么?

【问题讨论】:

  • 你想解决什么问题?

标签: postgresql hibernate spring-boot spring-data-jpa


【解决方案1】:

您需要在要在 UserRepository 类中编写的查询函数之上添加一个 @Query 注释。 例如

import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.repository.CrudRepository;
import com.svein.models.users;

public interface UserRepository extends CrudRepository<users, Long> {

    @Query("Select * from users")
    List<users> findAllUsers();

}

或者在您的 UserServiceImpl 中,userRepo.findAll() 应该可以工作。您不需要遍历每个用户并将其返回到列表。您应该简单地返回 userRepo.findAll()。

以下网址将使您对如何编写自己的查询有更多的了解。

https://www.baeldung.com/spring-data-jpa-query

【讨论】:

  • 不适用于 * 是否有其他使用 * 的方法? org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:* 靠近第 1 行第 8 列 [SELECT * FROM com.svein.models.users]
猜你喜欢
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2017-09-01
  • 1970-01-01
  • 2018-09-04
  • 2018-05-02
  • 2017-12-13
相关资源
最近更新 更多