2017-08-10 25 views
0

我使用SpringJpaRepository作为数据访问层。我有我的@Repository界面如下:Spring JpaSpecificationExecutor新的查询方法NoSuchElementException

@Repository 
interface EventRepository extends JpaRepository<Event, Long>, JpaSpecificationExecutor<Event> { 
    .... some custom methods irrelevant to this post .... 
} 

这里是我的简化模型类:

class Event { 
    Long eventID; 
    String name; 
    Date time; 
    Zone zone; 
} 


class Zone { 
    Long zoneId; 
    String zoneName; 
    User user; 
} 


class User { 
    Long userId; 
    String username; 
} 

我使用有JpaSpecificationExecutor为特定timeEvent的名单获取数据库。我使用这个方法,它正常工作:

Page<T> findAll(Specification<T> spec, Pageable pageable); 

但我想添加其他条件以便获取只对特定User条目。

我试图建立这样的新方法:

Page<Event> findAllByZone_User(User user, Specification<Event> spec, Pageable pageable); 

但是,当我把它称为我得到这一行例外:

java.util.NoSuchElementException: null 

它甚至有可能创造这样的方法?如果不是 - 我该如何继续?

+0

你可以尝试findByZoneUser(用户用户) – Barath

+0

@barath但什么'Specification'和'Pageable'? – user3626048

+0

尝试findByZoneUser(用户用户,规格规格,可分页分页) – CIPHER007

回答

0

我已经创建了一个像你这样的Spring boot project,这对我很有用。您可以查看下面我的代码.....

Event.java

package com.example.model; 

import java.util.Date; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToOne; 

@Entity 
public class Event { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long eventID; 
    private String name; 
    private Date time = new Date(); 

    @OneToOne(cascade = CascadeType.ALL) 
    private Zone zone; 

    public Long getEventID() { 
     return eventID; 
    } 
    public void setEventID(Long eventID) { 
     this.eventID = eventID; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Date getTime() { 
     return time; 
    } 
    public void setTime(Date time) { 
     this.time = time; 
    } 
    public Zone getZone() { 
     return zone; 
    } 
    public void setZone(Zone zone) { 
     this.zone = zone; 
    } 
} 

Zone.java

package com.example.model; 

import javax.persistence.CascadeType; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToOne; 

@Entity 
public class Zone { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long zoneId; 
    private String zoneName; 

    @OneToOne(cascade = CascadeType.ALL) 
    private User user; 

    public Long getZoneId() { 
     return zoneId; 
    } 
    public void setZoneId(Long zoneId) { 
     this.zoneId = zoneId; 
    } 
    public String getZoneName() { 
     return zoneName; 
    } 
    public void setZoneName(String zoneName) { 
     this.zoneName = zoneName; 
    } 
    public User getUser() { 
     return user; 
    } 
    public void setUser(User user) { 
     this.user = user; 
    } 
} 

User.java

package com.example.model; 

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 Long userId; 
    private String username; 

    public Long getUserId() { 
     return userId; 
    } 
    public void setUserId(Long userId) { 
     this.userId = userId; 
    } 
    public String getUsername() { 
     return username; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

个,我的仓库是

EventRepository.java

package com.example.model; 

import org.springframework.data.domain.Page; 
import org.springframework.data.domain.Pageable; 
import org.springframework.data.jpa.repository.JpaRepository; 

public interface EventRepository extends JpaRepository<Event, Long>, JpaSpecificationExecutor<Event>{ 

    Page<Event> findAllByZoneUser(User user, Pageable pageable); 
} 

UserRepository.java

package com.example.model; 

import org.springframework.data.jpa.repository.JpaRepository; 

public interface UserRepository extends JpaRepository<User, Long>{ 

} 

我直接调用库方法在我的控制器像下面

UserController中.java

package com.example.model; 

import java.util.HashMap; 
import java.util.Map; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.domain.PageRequest; 
import org.springframework.data.domain.Sort; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class UserController { 

    @Autowired 
    EventRepository eventRepository; 
    @Autowired 
    UserRepository userRepository; 

    @RequestMapping(value = "/{userId}", method = RequestMethod.GET) 
    public Map<String, Object> updateUserDO(@PathVariable Long userId) { 
     Map<String, Object> map = new HashMap<>(); 
     User user = userRepository.findOne(userId); 
     PageRequest pageRequest = new PageRequest(0, 10, Sort.Direction.ASC, "eventID"); 
     map.put("user", eventRepository.findAllByZoneUser(user, pageRequest)); 
     return map; 
    } 
} 
+0

您还可以在我的仓库和控制器'页 findAllByZoneUserUserId(龙用户id,可分页较小的变动后得到相同的结果);并在我的控制器中删除User User = userRepository.findOne(userId);并将eventRepository.findAllByZoneUser(user,pageRequest)更改为'eventRepository.findAllByZoneUserUserId(userId,pageRequest)' – CIPHER007

+0

不需要创建'UserRepository.java' – CIPHER007

+0

谢谢你的例子,它可以工作,但是当我添加'Specification '作为方法参数时,它停止工作。我通过在实现'Specification <>'接口的类中添加用户过滤来解决问题 – user3626048

相关问题