2017-07-12 96 views
0

我們使用彈簧數據jpa可用於spring boot 1.5.3。在存儲庫類中,我想從表中只提取幾列,包括來自子表(這是onetomany映射)的數據,所以我寫了一個查詢方法。 但該查詢方法不工作,並在日誌中看到下面的錯誤/警告春季數據jpa查詢中的子屬性不起作用

SQL Error: -104, SQLState: 42601 
DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=.;ARRAY + - ROW NEXTVAL PREVVAL NEXT PREVIOUS (<INTEGER>, DRIVER=4.19.26 

這裏是我的父實體:

@Entity 
@Table(name = "parent_table")  
public Class Parent { 
    // no-param constructor 

    Parent(int id, String name, Child childData) { 
     // assign these accordingly 
    } 
    // id, name, and couple of other mappings 

    @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true) 
    private Set<Child> childData; 
} 

實體Child:

@Entity 
@Table(name = "child_table") 
public class Child { 
    // id and couple of other columns 

    @ManyToOne (fetch = FetchType.LAZY) 
    @JoinColumn(name = "p_id", nullable = false, insertable = false, updatable = false) 
    private Parent parent; 

} 

和存儲庫是在這裏:

@Transactional 
public interface ParentRepository extends CrudRepository<Parent, Integer> { 

    @Query("select new Parent(id, name, p.childData) from Parent p where p.id=?1") 
    public Parent findOnlyChildDataById(final int id); 

} 

回答

0

不要使用自定義的方法,通過它的「身份證」來獲得實體,使用本地方法findOne

public interface ParentRepository extends CrudRepository<Parent, Integer> { 
} 

@Service  
public ParentService { 

    @Authoware 
    prvate ParentRepository repo; 

    public Parent getParentById(int id) { 
     return repo.getOne(id); 
    } 
} 
+0

感謝您的答覆。但是,在這裏我不需要父母的所有列。所以,我用jpa查詢編寫了自定義方法。 – Pawan

+0

如果您需要一個沒有某些屬性的實體,那麼這不是一個實體,而是一個[DTO](https://en.wikipedia.org/wiki/Data_transfer_object),您需要另一個[技術](https:// stackoverflow。 com/a/42946268)來處理它。 – Cepr0

+0

謝謝。但是,我已經在使用類似的方法在下面的回購工作正常。 @Query( 「選擇從父p其中p.application =?1新的父(ID,姓名,應用程序,anothercolumn)」) 公開名單 findAllByApplication(字符串應用程序) 我只得到我在哪裏的問題,包括子查詢中的屬性。 – Pawan