2017-08-10 3 views
0

データアクセスレイヤーとしてSpringJpaRepositoryを使用しています。私は以下のように私の@Repositoryインタフェースを持っている:春JpaSpecificationExecutor新しいクエリメソッドNoSuchElementException

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

は、ここに私の単純化モデルクラスです:私はそこJpaSpecificationExecutorを使用してい

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


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


class User { 
    Long userId; 
    String username; 
} 

特定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(ユーザーユーザー) 'Specification'と' Pageable'について – Barath

+0

@barathが、何をしようとすることはできますか? – user3626048

+0

あなたはまた、私のリポジトリとコントローラ 'ページの小さな変化 findAllByZoneUserUserId(ロングのuserId、Pageableの後に同じ結果を得ることができます' findAllByZone_User' – 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; 
    } 
} 
を確認することができます

と私のリポジトリが

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); 
} 

EventRepository.java

ある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

と同様CIPHER007 @(ユーザー、ユーザー、仕様スペック、ページング可能ページング可能) – CIPHER007

+0

これらの変更を行った後に、あなたは、 'UserRepository.java'を作成する必要はありません – CIPHER007

+0

あなたの例をありがとうございます、それは動作しますが、メソッドのパラメータとして' Specification 'を追加すると動作しなくなります。私は 'Specification <>'インタフェースを実装している私のクラスの中でユーザによるフィルタリングを追加することで問題を解決しました – user3626048

関連する問題