【问题标题】:Creating a database query Spring boot JPA?创建数据库查询 Spring Boot JPA?
【发布时间】:2020-02-08 18:37:51
【问题描述】:

我是 Spring Boot 的新手。我需要创建一个方法 findByCode,它有点类似于 findById(),但采用 Long 代码而不是 Long id。(代码不是主键)。有人可以帮忙

数据库 时间表映射(id、开始、结束、日期、代码)

时间表映射视图

@Entity
@Table(name="timetablemappings")
@EntityListeners(AuditingEntityListener.class)
public class TimeTableMapping {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String day;
    private String start;
    private String end;
    private String subject_code;
    private String time_table_code;
    private Long code;

//Constructor

//Getters and setters

时间表映射DAO

@Service
public class TimeTableMappingDAO {

    @Autowired
    TimeTableRepository timeTableRepository;

    @Autowired
    TimeTableMappingRepository timeTableMappingRepository;


    //to save
    public TimeTableMapping save(TimeTableMapping timeTableMapping){
        return timeTableMappingRepository.save(timeTableMapping);
    }

    //to save all
    public void saveAll(List<TimeTableMapping> timeTableMapping){
        timeTableMappingRepository.saveAll(timeTableMapping);
    }

        //to search all
    public List<TimeTableMapping> findAll(){
        return timeTableMappingRepository.findAll();
    }

    public List<Long> findDistinct(){
      return timeTableMappingRepository.findTimeTableMappingDistinctByCode();
   }

    //get by id
    public TimeTableMapping findById(Long id){
        return timeTableMappingRepository.findById(id).orElse(null);
    }

    public TimeTableMapping findByCode(Long code){
        return timeTableMappingRepository.findByCode(code).orElse(null);
    }


    //delete
    public void delete(Long id){
        timeTableMappingRepository.deleteById(id);
    }


}

timeTableMapping 控制器

@Controller
public class TimeTableMappingController {
    @Autowired
    private  TimeTableMappingDAO timeTableMappingDAO;

    @Autowired
    private TimeTableDAO timeTableDAO;

    @Autowired
    private SubjectDAO subjectDAO;

    @Autowired
    private StudentGroupDAO studentGroupDAO;

    @Autowired
    private DayDAO dayDAO;

    @Autowired
    private TimeDAO timeDAO;



    @RequestMapping("/timeTableMapping")
    public String viewHomePage(Model model){
        System.out.println("hey");
        List<Long> timeTableMappingDetails= timeTableMappingDAO.findDistinct();
       // List<TimeTableMapping>  timeTableMappingDetails=timeTableMappingDAO.select(timeTableMappingDetails1);
        System.out.println("hey");
        System.out.println(timeTableMappingDetails.toString());
        List<TimeTableMapping> tempList=new ArrayList<>();

        for(int i = 0 ; i < timeTableMappingDetails.size(); i++) {
            TimeTableMapping tempTimeTable = new TimeTableMapping();
            tempTimeTable.setCode(timeTableMappingDetails.get(i));
            tempList.add(tempTimeTable);
            System.out.println(timeTableMappingDetails.get(i));

        }
        model.addAttribute("timeTableMappingDetails",tempList);

        return "timeTableMapping";
    }


    @RequestMapping(value="/timeTableMapping/saveAll",method= RequestMethod.POST)
    public String saveTimeTable(@ModelAttribute("timeTableMapping") TimeTableMapping timeTableMapping){

        String[] dayArray = timeTableMapping.getDay().split(",");
        String[] subArray = timeTableMapping.getSubject_code().split(",");
         String[] startArray = timeTableMapping.getStart().split(",");
        String[] endArray = timeTableMapping.getEnd().split(",");

        String[] uniqueDay = Arrays.stream(dayArray).distinct().toArray(String[]::new);
        String[] uniqueStart = Arrays.stream(startArray).distinct().toArray(String[]::new);
        String[] uniqueEnd = Arrays.stream(endArray).distinct().toArray(String[]::new);


        List<TimeTableMapping> tempList = new ArrayList<>();
        int count=0;
        for(int j=0;j<uniqueStart.length;j++) {

            for(int i = 0 ; i < uniqueDay.length; i++) {
                TimeTableMapping tempTimeTable = new TimeTableMapping();
                tempTimeTable.setStart(uniqueStart[j]);
                System.out.println(uniqueStart[j]);

                tempTimeTable.setEnd(uniqueEnd[j]);
                tempTimeTable.setTime_table_code(timeTableMapping.getTime_table_code());
                tempTimeTable.setCode(timeTableMapping.getCode());
                tempTimeTable.setDay(uniqueDay[i]);
                tempTimeTable.setSubject_code(subArray[count]);
                tempList.add(tempTimeTable);
                count++;

            }
        }

        timeTableMappingDAO.saveAll(tempList);
        return  "redirect:/timeTableMapping";
    }


    @RequestMapping("/timeTableMapping/new")
    public String addTimeTableMapping(Model model){
        System.out.println("hey");
        System.out.println("hey");
        TimeTableMapping timeTableMapping =new TimeTableMapping();
        model.addAttribute("timeTableMapping",timeTableMapping);

        List<TimeTable> timeTableDetail = timeTableDAO.findAll();
        model.addAttribute("timeTables", timeTableDetail);

        List<Subject> subjectDetail = subjectDAO.findAll();
        model.addAttribute("subjects", subjectDetail);

        String[] days = new String[] { "Monday", "Tuesday"};

        List<Day> dayDetails = dayDAO.findAll();
        model.addAttribute("days",dayDetails);

        List<Time> timeDetails = timeDAO.findAll();
        model.addAttribute("times",timeDetails);

        return "addTimeTableMapping";
    }


    @RequestMapping("/timeTableMapping/edit/{id}")
    public ModelAndView updateTimeTable(@PathVariable(name="id")Long code){
        ModelAndView mav=new ModelAndView(("updateTimeTableMapping"));

        //mav.addObject("timeTableMapping", new TimeTableMapping());

        TimeTableMapping timeTableMapping = timeTableMappingDAO.findByCode(code);
        //System.out.println(timeTableMapping.getTime_table_code());
       // List<TimeTableMapping> timeTableMapping1= timeTableMappingDAO.select(timeTableMapping.getTime_table_code());
        mav.addObject("timeTableMapping",timeTableMapping);


        List<TimeTable> timeTableDetails = timeTableDAO.findAll();
        mav.addObject("timeTables", timeTableDetails);

        List<Subject> subjectDetails = subjectDAO.findAll();
        mav.addObject("subjects", subjectDetails);

        List<StudentGroup> studentGroupDetails = studentGroupDAO.findAll();
        mav.addObject("studentGroups",studentGroupDetails);

        List<Day> dayDetails = dayDAO.findAll();
        mav.addObject("days",dayDetails);

        List<Time> timeDetails = timeDAO.findAll();
        mav.addObject("times",timeDetails);


        return  mav;
    }

    @RequestMapping("/timeTableMapping/delete/{code}")
    public String deleteProduct(@PathVariable(name="code") Long code){
        timeTableDAO.delete(code);
        return  "redirect:/timeTableMapping";
    }
}

timeTableMapping 存储库

@Repository
public interface TimeTableMappingRepository extends JpaRepository<TimeTableMapping, Long> {
        //Optional<TimeTableMapping> findById(String id);
        //TimeTableMapping findTimeTableMappingsByTime_table_code(String time_table_code);
        @Query("SELECT DISTINCT t.code  FROM TimeTableMapping t")
        List<Long> findTimeTableMappingDistinctByCode();

        List<TimeTableMapping> findByCode(Long code);

        //public List<TimeTableMapping> findDistinctByCode();
}

【问题讨论】:

  • 在 ORM 映射类 TimeTableMapping 我看到你缺少 @column 注释 codesjava.com/jpa-column-annotation。当您尝试点击 findByCode 时,您是否在日志中收到任何错误?
  • 嘿,谢谢。我用错误更新了问题。我会试试你的方法。

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


【解决方案1】:

这应该可以工作

 List<TimeTableMapping> findByCode(Long code);

您不需要@Query。您可以按任何字段进行搜索。
如果你想要List&lt;Long&gt; 而不是List&lt;TimeTableMapping&gt;,这是不可能的。你得到List&lt;TimTableMapping&gt;,然后从中提取代码。

或者您可以编写一个投影,仅用于获取代码。即使在这种情况下,返回类型也必须是List&lt;TimeTableMapping&gt;。不同的是,只会获取代码字段而不是所有字段

【讨论】:

  • 嘿,谢谢,但我不想为这种方法找到 Distinct。对于这种方法,我需要使用该代码查找所有数据。(findTimeTableMappingDistinctByCode() 用于不同的事情)
  • 嘿,谢谢,我已经尝试过了,它显示错误错误:(47、42)java:找不到符号符号:方法findByCode(java.lang.Long)位置:com 类型的变量timeTableMappingRepository .project.attendance.repository.TimeTableMappingRepository
  • 这不可能。您能否放置完整的堆栈跟踪并使用您的存储库类更新问题(在您添加此方法之后)。需要看看它的样子
  • 嘿,该方法已经在我的存储库中,并使用错误屏幕截图进行了更新。但是它在 .orElse(null) 中显示错误并说无法解析方法。
  • 从错误中可以自我解释。您正在尝试 orElse 的返回类型是 List ..这是一个不同的问题。请接受并关闭此主题
【解决方案2】:

在存储库中,添加

@Query(" SELECT DISTINCT t.code  FROM TimeTableMapping t where Code=?1 ")
List<Long> findTimeTableMappingDistinctByCode(Long code);

?1表示第一个参数。

【讨论】:

  • 嘿,谢谢,但我不想为这种方法找到 Distinct。对于这种方法,我需要使用该代码查找所有数据。(findTimeTableMappingDistinctByCode() 用于不同的事情)
猜你喜欢
  • 2016-10-11
  • 2021-04-16
  • 2021-09-15
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多