2016-06-01 4 views
0

私はさらに残りのコールを用意し、クレジットのリレーションシップ(OneToManyとしてManyToOneおよびcreditBookingClassPaymentsとして以下のアカウントを参照してください)。 問題は今私がそれを動かすことができないということです。呼び出しは常に空の関係を返します。私は本当にこれについていくつかの助けに感謝します。ここで拡張されたSpringデータレストは、現在の実装でSpring-Boot、-HATEOAS、-Rest-Dataを使用して空のリレーションを提供します

が周囲は次のとおりです。

Credit.java

@Entity 
@Getter 
@Setter 
public class Credit { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Setter(NONE) 
    @Column(name = "id") 
    private Long itemId; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="account_id", nullable = false) 
    private Account account; 

    @OneToMany(mappedBy = "credit") 
    private List<CreditBookingClassPayment> creditBookingClassPayments = new ArrayList<>(); 

    @NotNull(message="Please enter a valid short name.") 
    @Column(length = 10, nullable = false) 
    private String shortName; 

    @NotNull(message="Please enter a valid name.") 
    @Column(nullable = false) 
    private String name; 

    ... 
} 

CreditRepositoryCustomImpl.java

そのrealation

...  
    @Override 
    public List<Credit> findDistinctByAccountItemIdNew(Long accountId) { 
     QCredit credit = QCredit.credit; 
     QAccount account = QAccount.account; 
     QCreditBookingClassPayment creditBookingClassPayment = QCreditBookingClassPayment.creditBookingClassPayment; 
     QBookingClass bookingClass = QBookingClass.bookingClass; 

     BooleanExpression hasAccountItemId = credit.account.itemId.eq(accountId); 
     List<Credit> credits = from(credit).where(hasAccountItemId) 
       .innerJoin(credit.account, account) 
       .leftJoin(credit.creditBookingClassPayments, creditBookingClassPayment) 
       .leftJoin(creditBookingClassPayment.bookingClass, bookingClass).groupBy(credit.itemId).fetch(); 
     return credits; 
    } 
... 
と信用リソースを強化するためにQueryDslを使用しています

CreditController.java

responseBodyここにすべて(口座やクレジットの支払い)に探して信用を保持creditResourcesEntityここ

CreditResourceIntegrTest.javaクレジット

@RepositoryRestController 
public class CreditController { 

    @Autowired 
    private CreditRepository creditRepository; 

    @RequestMapping(value = "/credit/search/findAllByAccountItemIdNew", method= RequestMethod.GET, produces = MediaTypes.HAL_JSON_VALUE) 
    @ResponseBody 
    public ResponseEntity<Resources<PersistentEntityResource>> findAllByAccountItemIdNew(@RequestParam Long accountId, PersistentEntityResourceAssembler persistentEntityResourceAssembler) { 
     List<Credit> credits = creditRepository.findDistinctByAccountItemIdNew(accountId); 
     Resources<PersistentEntityResource> responseBody = new Resources<PersistentEntityResource>(credits.stream() 
       .map(persistentEntityResourceAssembler::toResource) 
       .collect(Collectors.toList())); 
     return ResponseEntity.ok(responseBody); 
    } 

} 

のために利用可能ですが、アカウントがありますnullおよびcreditBookingClassPaymentは空の配列です

@Test 
public void testFindAllByAccountItemId() throws URISyntaxException { 
    URIBuilder builder = new URIBuilder(creditFindAllByAccountItemIdRestUrl); 
    builder.addParameter("accountId", String.valueOf(EXPECTED_ACCOUNT_ID)); 
    builder.addParameter("projection", "base"); 

    RequestEntity<Void> request = RequestEntity.get(builder.build()) 
      .accept(MediaTypes.HAL_JSON).acceptCharset(Charset.forName("UTF-8")).build(); 
    ResponseEntity<Resources<Resource<Credit>>> creditResourcesEntity = 
      restTemplate.exchange(request, new ParameterizedTypeReference<Resources<Resource<Credit>>>() {}); 

    assertEquals(HttpStatus.OK, creditResourcesEntity.getStatusCode()); 
    //assertEquals(EXPECTED_CREDIT_COUNT, creditResourcesEntity.getBody().getContent().size()); 
} 

私は何かが恋しいですか?

ありがとうございました! Karsten

答えて

0

いいえ、PersistentEntityResourceAssemblerはリレーションをサポートしていません。しかし、これは予測を使って処理することができます。

CreditProjection.java

@Projection(name = "base" , types = Credit.class) 
public interface CreditProjection { 

    String getShortName(); 
    String getName(); 
    List<CreditBookingClassPaymentProjection> getCreditBookingClassPayments(); 
    BigDecimal getValue(); 
    BigDecimal getInterestRate(); 
    BigDecimal getMonthlyRate(); 

} 

CreditBookingClassPaymentProjection.java

@Projection(name = "base" , types = CreditBookingClassPayment.class) 
public interface CreditBookingClassPaymentProjection { 

    BookingClass getBookingClass(); 
    CreditPaymentType getCreditPaymentType(); 

} 

CreditController.java

@RepositoryRestController 
public class CreditController { 

    @Autowired 
    private ProjectionFactory projectionFactory; 

    @Autowired 
    private CreditRepository creditRepository; 

    @RequestMapping(value = "/credit/search/findAllByAccountItemIdNew", method = RequestMethod.GET, produces = MediaTypes.HAL_JSON_VALUE) 
    @ResponseBody 
    public ResponseEntity<Resources<?>> findAllByAccountItemIdNew(@RequestParam Long accountId, 
      PersistentEntityResourceAssembler persistentEntityResourceAssembler) { 
     List<Credit> credits = creditRepository.findDistinctByAccountItemIdNew(accountId); 

     List<PersistentEntityResource> creditResources = new ArrayList<>(); 
     for (Credit credit : credits) { 
      // credit.getCreditBookingClassPayments() 
      PersistentEntityResource creditResource = persistentEntityResourceAssembler.toResource(credit); 
      creditResources.add(creditResource); 
     } 

     Resources<CreditProjection> responseBody = new Resources<CreditProjection>(credits.stream() 
       .map(credit -> projectionFactory.createProjection(CreditProjection.class, credit)) 
       .collect(Collectors.toList())); 

     return ResponseEntity.ok(responseBody); 
    } 

} 
関連する問題