2011-03-02 6 views
1

コンポジットの埋め込み可能なキーテーブルでselectを使用して、1回の呼び出しで2つのプロパティを取得することはできません。最初にカウントを取得してからページングします。同じロジックがサイト全体で使用されています。私は以下のエラーをクエリで取得します。本当にここで失われた。コンポジットのコンビネーションテーブルで結合が行われない

java.sql.SQLSyntaxErrorException:ORA-00904: "U3 _" "ID":無効な識別子

select 
      count(*) as y0_ 
     from 
      TEST.USERBADGES this_ 
     where 
      u3_.ID=? 
    Hibernate: 
     select 
      count(*) as y0_ 
     from 
      TEST.USERBADGES this_ 
     where 
      u3_.ID=? 


Criteria criteria = userBadgeRepository.getCritieria(); 

      criteria.createCriteria("userBadgePK", "ub", 1); 
      criteria.createCriteria("ub.badge", "b", 1); 
      criteria.createCriteria("ub.user", "u", 1); 

UserBadge.java

@Entity 
@Table(name = "USERBADGES", schema = "TEST") 
@SuppressWarnings("serial") 
@AssociationOverrides({ 
@AssociationOverride(name = "userBadgesPK.user", joinColumns = @JoinColumn(name = "userid")), 
@AssociationOverride(name = "userBadgesPK.badge", joinColumns = @JoinColumn(name = "badgeid")) 
}) 
public class UserBadge implements Serializable { 

    /** 
    * Primary key 
    */ 

    private UserBadgePK userBadgesPK = new UserBadgePK(); 

    /** 
    * Attribute visible. 
    */ 
    private Long visible; 

    /** 
    * Attribute datecreated. 
    */ 
    private Date dateCreated; 


    /** 
    * Get the primary key 
    */ 
    @Basic 
    @EmbeddedId 
    public UserBadgePK getUserBadgePK() { 
     return this.userBadgesPK; 
    } 

    /** 
    * set the primary key 
    */ 
    public void setUserBadgePK(UserBadgePK userBadgesPK) { 
     this.userBadgesPK = userBadgesPK; 
    } 

    /** 
    * get users 
    */ 
    @Transient 
    public User getUser() { 
     return this.getUserBadgePK().user; 
    } 

    /** 
    * set users 
    */ 
    public void setUser(User user) { 
     getUserBadgePK().setUser(user); 
    }  
    /** 
    * get badges 
    */ 
    @Transient 
    public Badge getBadge() { 
     return getUserBadgePK().badge; 
    } 

    /** 
    * set badges 
    */ 
    public void setBadge(Badge badge) { 
     getUserBadgePK().setBadge(badge); 
    } 

    /** 
    * @return visible 
    */ 
    @Basic 
    @Column(name = "VISIBLE") 
     public Long getVisible() { 
     return visible; 
    } 

    /** 
    * @param visible new value for visible 
    */ 
    public void setVisible(Long visible) { 
     this.visible = visible; 
    } 

    /** 
    * @return datecreated 
    */ 
    @Basic 
    @Column(name = "DATECREATED") 
     public Date getDateCreated() { 
     return dateCreated; 
    } 

    /** 
    * @param datecreated new value for datecreated 
    */ 
    public void setDateCreated(Date dateCreated) { 
     this.dateCreated = dateCreated; 
    } 


    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     UserBadge that = (UserBadge) o; 

     if (getUserBadgePK() != null ? !getUserBadgePK().equals(that.getUserBadgePK()) : that.getUserBadgePK() != null) return false; 

     return true; 
    } 

    public int hashCode() { 
     return (getUserBadgePK() != null ? getUserBadgePK().hashCode() : 0); 
    } 


    @SuppressWarnings("serial") 
    @Embeddable 
    public static class UserBadgePK implements Serializable { 

     /** 
     * Attribute users 
     */ 
     private User user; 


     /** 
     * Attribute badges 
     */ 
     private Badge badge; 


     /** 
     * get users 
     */ 
     @ManyToOne(fetch=FetchType.EAGER) 
     public User getUser() { 
      return this.user; 
     } 

     /** 
     * set users 
     */ 
     public void setUser(User user) { 
      this.user = user; 
     }  
     /** 
     * get badges 
     */ 
     @ManyToOne(fetch=FetchType.EAGER) 
     public Badge getBadge() { 
      return this.badge; 
     } 

     /** 
     * set badges 
     */ 
     public void setBadge(Badge badge) { 
      this.badge = badge; 
     }  

     @Override 
     public boolean equals(Object o) { 
      if (this == o) return true; 
      if (o == null || getClass() != o.getClass()) return false; 

      UserBadgePK that = (UserBadgePK) o; 

      if (badge != null ? !badge.equals(that.badge) : that.badge != null) return false; 
      if (user != null ? !user.equals(that.user) : that.user != null) 
       return false; 

      return true; 
     } 

     @Override 
     public int hashCode() { 
      int result; 
      result = (badge != null ? badge.hashCode() : 0); 
      result = 31 * result + (user != null ? user.hashCode() : 0); 
      return result; 
     } 

    } 
} 

答えて

1

あなたは上のsubcriteriaを作成することはできません埋め込みオブジェクト。サブクエリを作成すると、SQLクエリにジョインを追加するようにマッピングされます。埋め込みフィールドには結合を作成しません。

また、ご参加のタイプの定数ではなく、魔法の値を使用してください:

criteria.createCriteria("ub.badge", "b", Criteria.LEFT_JOIN); 

がはるかに読みやすいあなたは私達にあなたのエンティティとその関係を示していない

criteria.createCriteria("ub.badge", "b", 1); 

よりもですが、彼のコードはうまくいくかもしれません:

Criteria criteria = userBadgeRepository.getCritieria(); // sic 

criteria.createCriteria("userBadgePK.badge", "b", Criteria.INNER_JOIN); 
// you don't have foreign keys pointing to nowhere, have you? 
// So an INNER join is preferred here 
criteria.createCriteria("userBadgePK.user", "u", Criteria.INNER_JOIN); 
+0

返信ありがとうございます。私は前にそれを持っていた、それはまだ、同じエラーが動作しませんでした。私はエンティティを掲載します。他の提案? –

+0

getUserBadgePKメソッドで@Basicを削除してみてください。 –

+0

同じエラーが発生しています。 –

関連する問題