0

我是 spring-data 的新手,我有这个错误java.lang.String cannot be cast to com.example.accessingdatamysql.User,不知道如何解决它!我添加了我的代码的各个相关部分。

该方法应按名称输出最旧的条目(通过时间戳)。

Main.Controller

package com.example.accessingdatamysql;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller 
@RequestMapping(path="/demo") 
public class MainController {
  @Autowired 
         
  private UserRepository userRepository;

  @Transactional
  @PostMapping(path="/add")
  public @ResponseBody String addNewUser (@RequestParam String name,
          @RequestParam String email,@RequestParam String surname) 
  {
      User n = new User();
      n.setName(name);
      n.setSurname(surname);
      n.setEmail(email);
      userRepository.create(n);
      return "Saved";
  }

  @GetMapping(path="first")
  User one(@RequestParam String name) {
      return userRepository.findFirstByName(name);
  }
}  

User.java

package com.example.accessingdatamysql;

import java.sql.Timestamp;
import java.time.Instant;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity 
public class  User {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Integer id;
 
  public String name;

  private String email;
  
  private String surname;
  
  @Column(name="stmp", columnDefinition = "TIMESTAMP (6)")
  Timestamp timestamp = Timestamp.from(Instant.now());

  public void setTimestamp(Timestamp timestamp) {
      this.timestamp = timestamp;
  }

  public Timestamp getTimestamp() {
      return timestamp;
  }

  public String getSurname() {
      return surname;
  }
 
  public void setSurname(String surname) {
      this.surname = surname;
  }
 
  public Integer getId() {
      return id;
  }

  public void setId(Integer id) {
      this.id = id;
  }

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public String getEmail() {
      return email;
  }

  public void setEmail(String email) {
      this.email = email;
  }
}

RepoImpl.java

package com.example.accessingdatamysql;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import org.springframework.stereotype.Component;

@Component
public class UserRepositoryImpl implements UserRepository {
    
    private final EntityManager em;
    
    public UserRepositoryImpl(EntityManager entityManager) {
        this.em = entityManager;
    }

    @Override
    public User findFirstByName(String name) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<User> criteria = builder.createQuery(User.class);
        Root<User> root = criteria.from(User.class);
        criteria.select(root.get("name"));
        criteria.orderBy(builder.asc(root.get("timestamp")));
        TypedQuery<User> query = em.createQuery(criteria).setMaxResults(1);
        return query.getSingleResult();
    }
    
    @Override
//  per la creazione//
    public void create(User entity) {
        em.persist(entity); 
    }   
}

错误

 [Request processing failed; nested exception is java.lang.ClassCastException: java.lang.String cannot be cast to com.example.accessingdatamysql.User] with root cause
java.lang.ClassCastException: java.lang.String cannot be cast to com.example.accessingdatamysql.User
        at com.example.accessingdatamysql.UserRepositoryImpl.findFirstByName(UserRepositoryImpl.java:35) ~[classes!/:0.0.1-SNAPSHOT]
4

2 回答 2

1

如果您打算User按名称查找,则应该将过滤器参数设置为不是 incriteria.select而是 in criteria.where

public User findFirstByName(String name) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<User> criteria = builder.createQuery(User.class);
    Root<User> root = criteria.from(User.class); // root is User
    criteria.select(root).where(builder.equal(root.get("name"), name));
    criteria.orderBy(builder.asc(root.get("timestamp")));
    TypedQuery<User> query = em.createQuery(criteria).setMaxResults(1);
    return query.getSingleResult();
}

虽然criteria.select(root.get("name"));暗示只"name"选择并返回列,但应该返回第一个用户的名称。

如果需要此类信息,可以通过以下方式检索:

public String findFirstUserName() {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<String> criteria = builder.createQuery(String.class);
    Root<User> root = criteria.from(User.class); // root is User
    criteria.select(root.get("name"));  // getting name 
    criteria.orderBy(builder.asc(root.get("timestamp"))); // of the first/earliest user 
    TypedQuery<String> query = em.createQuery(criteria).setMaxResults(1);
    return query.getSingleResult();
}
于 2020-10-01T18:43:22.427 回答
0

就像错误所说的那样 -

CriteriaQuery<String> criteria = builder.createQuery(String.class);

代替

CriteriaQuery<User> criteria = builder.createQuery(User.class);

在这里阅读更多参考

于 2020-10-01T17:54:38.353 回答