仅记录用户的完整日历数据

s1ag04yj  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(233)

对于我的项目,我使用fullcalendar和spring。我的sql数据库中的事件数据分为以下列:id-doctor\u id-patient\u id-start-end。
我只想显示与登录用户相关的事件(登录所需的数据包含在另一个名为doctor的sql表中):现在显示的是所有用户的事件。
这是我的控制器类:

@RestController
class EventController {

    @Autowired
    private EventJpaRepository eventRepository;

    @RequestMapping(value="/allevents", method=RequestMethod.GET)
    public List<Event> events() {
        return eventRepository.findAll();
    }

    @RequestMapping(value="/events", method=RequestMethod.GET)
    public List<Event> getEventsInRange(@RequestParam(value = "start", required = true) String start, 
                        @RequestParam(value = "end", required = true) String end, @RequestParam(value = "title", required = true) String title) {
    Date startDate = null;
    Date endDate = null;
    SimpleDateFormat inputDateFormat=new SimpleDateFormat("yyyy-MM-dd");

    try {
        startDate = inputDateFormat.parse(start);
    } catch (ParseException e) {
        throw new BadDateFormatException("bad start date: " + start);
    }

    try {
        endDate = inputDateFormat.parse(end);
    } catch (ParseException e) {
        throw new BadDateFormatException("bad end date: " + end);
    }

    LocalDateTime startDateTime = LocalDateTime.ofInstant(startDate.toInstant(),
    ZoneId.systemDefault());

    LocalDateTime endDateTime = LocalDateTime.ofInstant(endDate.toInstant(),
    ZoneId.systemDefault());

    return eventRepository.findByDateBetween(startDateTime, endDateTime); 
    }
}

这是事件存储库:

@Repository
interface EventJpaRepository extends JpaRepository<Event, Long> {

    @Query("select b from Event b where b.start >= ?1 and b.end <= ?2")
    public List<Event> findByDateBetween(LocalDateTime start, LocalDateTime end);

}

这是我的html页面中的fullcalendar脚本:

<script> 
    document.addEventListener('DOMContentLoaded', function() {
        var calendarEl = document.getElementById('calendar');
        var calendar = new FullCalendar.Calendar(calendarEl, {
            initialView : 'dayGridMonth',
            headerToolbar: {
                left: 'prev,next today',
                center: 'title',
                right: 'dayGridMonth,timeGridWeek,timeGridDay'
            },
            locale: 'it',
            editable : false,
            eventLimit : true, // allow "more" link when too many events
            events : {
                url : '/allevents',
                type : 'GET',
                error : function() {
                    alert('there was an error while fetching events!');
                },
            }
        });     
        calendar.render();
    });

</script>
omjgkv6w

omjgkv6w1#

你的代码缺少一些东西。现在,查询返回一个时间范围内的所有事件。要将此限制为仅登录用户,您需要加入 Doctor 查询中具有用户id的表。不知道会话是如何存储的,或者 Doctor 表看起来,您的查询可能需要更新如下内容:

@Query("select b from Event b join Doctor d on b.doctor_id=d.id where b.doctorId = ?1 AND b.start >= ?2 and b.end <= ?3")
public List<Event> findByDoctorIdAndDateBetween(Long doctorId, LocalDateTime start, LocalDateTime end, String userId);

我还没测试过,但这会让你朝着正确的方向前进。
编辑:对不起,我已经有一段时间没有写jpa了。我已经更新了上面的查询,您需要一个

@OneToMany(mappedBy="doctorId")
List<Event> events;

Doctor 对象。和一个

@ManyToOne
Long doctorId

Event . 然后,您应该能够在从会话中检索到查询之后,将doctor\u id传递给该查询。在springdatajpa中连接两个表实体的问题提供了一些关于如何在jpa查询中连接表的好信息。

相关问题