2016-04-18 13 views
0

私は2つの休止状態のエンティティ:KennelDogを持っています。Hibernate:年齢に基づいてオブジェクトを注文する

私のデータベースにある「最も古い」ケンネルが何であるかを判断する方法を書いてみたいと思います。

ケンネルエンティティに「作成済み」または同様の列があるが、ではない場合は、これは簡単なことです。

しかし、私のDogエンティティにはBORN columnにマップするbornフィールド(DateTime)があります。私はそれ最古の犬を持っているによって最古の犬小屋を定義したいと思い、この犬のフィールドを使用して

犬は多くの犬を持つことができますが、犬は1つの犬舎しか持つことができません。

どうすればいいですか?

エンティティ:

ケンネル:

@Entity 
@Table(name = "KENNEL") 
public class Kennel 
{ 
    @Id 
    private String id; 

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

} 

犬:

@Entity 
@Table(name = "DOG") 
public class Dog 
{ 
    @Id 
    private String id; 

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

    @Column(name = "BORN") 
    private DateTime created; 

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

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "KENNEL_ID") 
    private Kennel kennel; 

} 

答えて

1

@ Markの提案を実装しようとしています。

Dogクラスに名前付きクエリを作成し、それをDAOから呼び出します。 HibernateのEntityManagerを使用して

@Entity 
@Table(name = "DOG") 
@NamedQueries({ 
    @NamedQuery(name="Dog.findOldestKennel", query="SELECT d.kennel 
     FROM Dog d order by d.created ASC LIMIT 1"), 
    @NamedQuery(name="Dog.getAllKennelsInAgeOrder", query="SELECT d.kennel 
     FROM Dog d order by d.created ASC") 
}) 
public class Dog { 
    @Id 
    private String id; 

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

    @Column(name = "BORN") 
    private DateTime created; 

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

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "KENNEL_ID") 
    private Kennel kennel; 

} 

サンプルDAOの方法は、あなたが言っていることために、すべての犬小屋を取得するために(プロジェクトの実装が異なる場合があります)を以下に示します。ここでは、Dogクラスで作成された名前付きクエリを呼び出して、結果リストを返します。

public List<Kennel> getAllKennels(){ 
    try{ 
     // name of the desired NamedQuery to run should be given 
     Query queryStr = this.entityManager 
      .createNamedQuery("Dog.getAllKennelsInAgeOrder");    
     List<Kennel> kennels = queryStr.getResultList(); 

     if(null != kennels && !kennels.isEmpty()){ 
      return kennels; 
     } else { 
      return Collections.emptyList(); 
     } 
    } catch (Exception e) { 
     LOGGER.error("Exception Occcured in getAllKennels ", e); 
    } 
} 
+0

ありがとうございます。しかし、私はどのようにして残りの犬小屋も注文しますか?私。最も古いものから最も若いものまで? – java123999

+1

クエリの最後に 'LIMIT 1'を削除するだけです。それは、最も古いものから最も若いものに命じられた犬舎の全リストを返します。 – SarathChandra

+0

ありがとう、これを使用する例を教えてもらえますか?申し訳ありませんが、SQLクエリを使用するのが非常に新しいです – java123999

1

理由だけではなく、あなたが言ったようにすることは自明である、最古の犬を見つけることができませんし、 dog.kennelを使用してケンネルを入手しますか?

+0

どういう意味ですか?あなたは例を投稿できますか?ありがとう – java123999

+0

私は、最も古い犬舎の代わりに最も古い犬のクエリを実行することを意味します。一番古い犬をオブジェクトとしてJavaコードに入れたら、犬のオブジェクトが属する犬舎への参照を取得するだけです。 –

+0

でも、残りの犬小屋もどうやって注文すればいいですか?私。最も古いものから最も若いものまで? – java123999

関連する問題