2012-05-08 11 views
2

私はSpringデータHibernateなどでRESTアプリケーションを開発しています。私はすべての基本的なアクションをセットアップしましたが、今は何かしたいです特定。 データベース内の別のテーブルに外部キーを持つ項目のリストを取得すると、hibernateはその外部キーの行全体を返します。たとえば:spring-data/hibernate/restでオブジェクトが返される方法を変更する方法

[ { 
    "id":1, 
    "school": {"id":1, "name":"De regenboog", password":"800e30e9bb3b82ce955a127650d835d0", "street":"Plantaanstraat", "number":"2", "zipCode":"1234AS", "city":"Amsterdam", "contactName":"Arends", "contactPhoneNumber":"06-45648466", "contactEmail":"[email protected]"}, 
    "name":"Groep", 
    "dateCreated":"2012-04-25" 
    } 
] 

(これらは方法によって、すべて架空のデータがある)

今の事である学校は、その全体が返されることしたくないです。私はschool_idを表示したいだけです。 私はウェブを検索し、 "サービスレベルのマッピング"についていくつかのことを読んだが、例は見つけられなかった。 >サービス - - > DAO - >リポジトリ

セットアップ私は

コントローラで自分のアプリケーションを構築しました。

私があなたを助けてくれることを願っています! (もっと多くのソースコードが必要な場合はお知らせください)。私は追加したい事は、私のMySQLのテーブルはこのようになっていることである

EDIT

たくさん

ありがとう:

ID | SCHOOL_ID | NAME | DATE_CREATED

それでは、私は戻ってきたいと思いする代わりに(この状況で)対象校の単なるschool_idある

EDIT2 私は@Dandy答えに働いていると私は、表示したいです私が今持っているコード:

@ManyToOne 
@JoinColumn(name = "SCHOOL_ID") 
private School school; 

@Column(name = "SCHOOL_ID", insertable = false, updatable = false) 
private long schoolId; 

public long getSchoolId() { 
    return schoolId; 
} 

public void setSchoolId(long schoolId) { 
    this.schoolId = schoolId; 
} 

public School getSchool() { 
    return school; 
} 

public void setSchool(School school) { 
    this.school = school; 
} 

私はダニーのようにコードを変更すると、私はほんの少しの結果が得られます。 これは私が今、クエリを実行する場合、私が得るものです:

[ { 
    "id":1, 
    "school": {"id":1, "name":"De regenboog", password":"800e30e9bb3b82ce955a127650d835d0", "street":"Plantaanstraat", "number":"2", "zipCode":"1234AS", "city":"Amsterdam", "contactName":"Arends", "contactPhoneNumber":"06-45648466", "contactEmail":"[email protected]"},  
    "schoolId": 1 
    "name":"Groep", 
    "dateCreated":"2012-04-25" 
    } 
] 

事は、私は、この特定のクエリに対してschoolを無効にしたいということです。それは可能ですか?

答えて

2

数日が経過し、私のために働く解決策が見つかりました。私はIE SchoolDTO(DTOはデータ転送オブジェクトの略)の新しいクラスをいくつか作った。これらのクラスの中で私はフロントエンドに示したかった値を追加しました。すなわち:

public class ClassesDTO { 

    private long id; 
    private long schoolId; 
    private String schoolName; 
    private String name; 
    private Date dateCreated; 

    //Getters and setters... 
} 

私は唯一のIDと名前が含まれている学校オブジェクト全体を表示する代わりに。このクラスの中にはゲッターとセッターしかありません。次に、元のクラスを新しいDTOクラスにマッピングするマッパーを作成します。すなわち、

public ClassesDTO mapToDTO(Classes classes) { 
    ClassesDTO classesDTO = new ClassesDTO(); 
    classesDTO.setId(classes.getId()); 
    classesDTO.setSchoolId(classes.getSchool().getId()); 
    classesDTO.setSchoolName(classes.getSchool().getName()); 
    // etc... 

はその後、私のサービス層に私は私のコントローラの代わりに、通常のクラスオブジェクトにマッピングされた新しいDTOオブジェクトを返します。

それはすべて実際です。 java.util.Listを返す必要がある場合はマッピングがあり、学校全体を宣言することなくデータをデータベースに挿入したい場合は逆もあります。私はちょうど誰かが私はこれをしなかったか疑問。このの簡単な例を紹介します:

public Classes mapFromDTOCreate(ClassesCreateDTO classesCreateDTO){ 
    Classes classes = new Classes(); 
    classes.setSchool(schoolDAO.findSchoolById(classesCreateDTO.getSchoolId())); 
    classes.setName(classesCreateDTO.getName()); 
    classes.setDateCreated(classesCreateDTO.getDateCreated()); 
    return classes; 
} 

この新しいクラスは、私は安全にHibernateはORM(オブジェクトリレーショナルの私のデータベースの原因に保存することができた私のDAOに戻ることができますオブジェクトマッピング)。

質問がありましたら、お知らせください。

1

JSONシリアル化に(デフォルトの)ジャクソンマッパーを使用している場合は、エンティティのシリアル化を望まない場合は、プロパティに@JsonIgnoreのプロパティをアノテートできます。

+0

この問題は(私が思うのですが)、私は彼らが見せたいと思う状況があるということです。それらを管理するには? (私が学校に照会するときのように) –

2

現在schoolは、<many-to-one>の関係を使用してマップされている可能性があります。

<many-to-one name="school" class="School"> 
    <column name="SCHOOL_ID" type="string" /> 
</many-to-one> 

SCHOOL_IDのフィールドをもう1つdelcareすることができます。

<property name="schoolId" column="SCHOOL_ID" type="string" insert="false" update="false"/>

注:列が複数回マッピングされている場合insert="false" update="false"が必要とされています。

+0

ありがとう!やってみます! –

+0

私が今実行している問題は、Spring-dataが元の学校を使ってすべてのクラスをリストすることです。その振る舞いを無効にするどんな方法でも、spring-dataに新しいschoolIdを使うことができますか? –

+0

私の質問が更新されました –

関連する問題