2017-12-20 15 views
0

CrudRepository을 확장 한 저장소를 구현했습니다. 기본 모델 (Account)은 plaidAccountId 필드를 가지며 해당 쿼리 메서드는 findByPlaidAccountId입니다. 내가 말할 수있는 가장 좋은 것은 다른 모델의 다른 쿼리가 올바르게 작동하는 것처럼이 유선이 올바르게 연결되어 있습니다. 그러나이 쿼리는 결과를 반환하지 않습니다. 제공된 쿼리 매개 변수와 일치하는 데이터베이스에 항목이 있음을 수동으로 확인했지만 여전히 null이 반환됩니다.Spring CrudRepository findBy * 결과가없는 메소드

다음은 관련 구성입니다. 내가 게시 할 수있는 것이 있다면 유용 할 것입니다. 미리 감사드립니다.

쿼리 내가 실행 해요 :

내가 accountService가 초기화 및 account.getAccount()이 예상되는 문자열 값을 제공하고 있는지 확인하기 위해 로그인 한

accountService.findByPlaidAccountId(account.getAccountId()

.

// AccountRepository.java 
@Repository 
public interface AccountRepository extends CrudRepository<Account, Long> { 

    Set<Account> findAllByUser(User user); 
    Account findByPlaidAccountId(String plaidAccountId); 
    Account findById(int id); 
    Account findAccountByPlaidAccountId(String plaidAccountId); 
} 

-

// AccountService.java 
@Service 
public class AccountService { 

    private AccountRepository accountRepository; 

    @Autowired 
    public AccountService(AccountRepository repository) { 
     this.accountRepository = repository; 
    } 

    public Account findById(int id) { 
     return accountRepository.findById(id); 
    } 

    public Account findByPlaidAccountId(String plaidAccountId) { 
     return accountRepository.findByPlaidAccountId(plaidAccountId); 
    } 

    public Iterable<Account> findAll() { 
     return accountRepository.findAll(); 
    } 

    public Set<Account> findAllByUser(User user) { 
     return accountRepository.findAllByUser(user); 
    } 

    public void saveAccount(Account account) { 
     accountRepository.save(account); 
    } 

    public Account findAccountByPlaidAccountId(String plaidAccountId) { 
     return accountRepository.findAccountByPlaidAccountId(plaidAccountId); 
    } 
} 

-

// Account.java 
@Entity 
@Table(name = "accounts") 
public class Account { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "account_id") 
private int id; 

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "user_id", nullable = false) 
private User user; 

@Column(name = "plaid_account_id") 
@NotEmpty(message = "Plaid account number is required") 
private String plaidAccountId; 

@Column(name = "account_type") 
private String accountType; 

@Column(name = "account_subtype") 
private String accountSubtype; 

@Column(name = "institution_id") 
private String institutionId; 

@Column(name = "current_balance") 
private double currentBalance; 

@Column(name = "available_balance") 
private double availableBalance; 

@Column(name = "account_limit") 
private double accountLimit; 

@Column(name = "name") 
private String name; 

@Column(name = "official_name") 
private String officialName; 

@Column(name = "mask") 
private String mask; 

@ManyToOne 
@JoinColumn(name = "plaid_item_id", nullable = false) 
private PlaidItem plaidItem; 

public Account() { 
} 
// ... getters and setters 

업데이트 : JPA SQL 로깅

난 당신의 코드에서를 생성 할 수있는 몇 가지를 볼
Hibernate: select account0_.account_id as account_1_0_, account0_.account_limit as account_2_0_, account0_.account_subtype as account_3_0_, account0_.account_type as account_4_0_, account0_.available_balance as availabl5_0_, account0_.current_balance as current_6_0_, account0_.institution_id as institut7_0_, account0_.mask as mask8_0_, account0_.name as name9_0_, account0_.official_name as officia10_0_, account0_.plaid_account_id as plaid_a11_0_, account0_.plaid_item_id as plaid_i12_0_, account0_.user_id as user_id13_0_ from accounts account0_ where account0_.plaid_account_id=? 
+0

설명은 확장 토론이 아닙니다. 이 대화는 [채팅으로 이동되었습니다] (http://chat.stackoverflow.com/rooms/161619/discussion-on-question-by-justinraczak-spring-crudrepository-findby-method-retu). –

답변

1

미래의 문제, 나는 그들이 당신에게 머리를 쥐지 만 장래에 당신에게 하나를 줄 것 인지를 모른다.

// AccountRepository.java 
@Repository 
public interface AccountRepository extends CrudRepository<Account, Long> {   
    Set<Account> findAllByUser(User user);   
    Account findByPlaidAccountId(String plaidAccountId);  
    Account findById(int id);   
    Account findByPlaidAccountId(String plaidAccountId); 
} 

첫 번째 것은 "CrudRepository<Account, Long>는"당신이 여기 오래 가지고 있지만 클래스의 ID가 "INT"입니다, 그들은 동일해야합니다.

Account findByPlaidAccountId(String plaidAccountId); 
Account findAccountByPlaidAccountId(String plaidAccountId); 

그 두 가지 방법

은 수익에서 하나의 계정 개체를 기대하지만, plaidAccountId 고유 또는 PK하지 않습니다, 그래서 당신은 목록을 기대해야합니다. 당신은 단지 하나 개의 요소가 있는지 확인하고 바로 Set/List<Account> 및 서비스에 저장소를 변경하려면 aplication에 목록을 처리하는 일을하지 않으면 은 다음과 같이 유지 :

public Account findByPlaidAccountId(String plaidAccountId) { 
     return accountRepository.findByPlaidAccountId(plaidAccountId).get(0); 
} 

또는

findFirstByPlaidAccountId 

null 반환과 함께 행운을 빌어 요;).

+0

질문에서 문제를 해결하지 못하기 때문에이 답변을 수락 할 수 없지만이 팁에 정말 감사드립니다! 이러한 것들은 프레임 워크를 배울 때 이해하는데 도움이됩니다. CrudRepository 확장의 ID 값에 대한 질문 : 내 모델에서는 원시 int 값을 사용하지만 저장소 인스턴스는 프리미티브를 사용하지 않습니다. 거기에 정수를 건네도 똑같은 행동을합니까? – justinraczak

0

당신이 (당신의 메소드가 호출되는 방식) plaidAccountId로 검색하면 내가 대신 몇 가지 이유를 들어 account.getAccountId()

accountService.findByPlaidAccountId(...) 
+0

제안 해 주셔서 감사합니다. 그러나 이것은 도메인 모델 간의 불일치 일뿐입니다. 외부 적으로, API로부터, 목표 값은'accountId'로 리턴됩니다. 내 앱에 내부 계정 ID가 있기 때문에'plaid' 네임 스페이스를 추가하므로'accountId'의 _external_ 값은'plaidAccountId'의 _internal_ 값에 매핑됩니다. 이 두 값은 각각에 매핑되므로'getAccountId()'의 결과는 전달할 올바른 값입니다. – justinraczak

0

의 ID를 전달한다고 가정 내 값은 데이터베이스 화 을 포함하여 저장 한 자신의 따옴표 때문에 정확한 쿼리는 기술적으로 "<value>"입니다.