0

私のプロジェクトでは、EclipseIndigo内でJPA2とHibernateを使用しています。
プロジェクト内のすべてのエンティティに必要ないくつかのフィールドを提供する抽象BaseEntityクラスがあります。したがって、このクラスは、プロジェクトで使用する他のすべてのエンティティによって拡張されます。
BaseEntityのフィールドの1つはブールフィールドdeletedです。これは、エントリを削除済みとしてマークするために必要です(データベースからオブジェクトを物理的に削除することは許可されていません)。サブクラスに名前付きクエリを設定し、WHERE句で「NOTu.deleted」を使用しようとすると、コンパイラから次のエラーメッセージが表示されます
。状態フィールドパス「r.deleted」を解決できません。有効なタイプに。

BaseEntityのコードの下:

@MappedSuperclass
public abstract class BaseEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  protected Long id;

  @Version
  protected int version;

  @Column(nullable = false, columnDefinition = "boolean default false")
  protected boolean deleted;

  public boolean isDeleted() {
      return deleted;
  }

  public boolean getDeleted() { // for test-purposes introduced both - isDeleted() & getDeleted()
      return deleted;
  }

  public void setDeleted(boolean deleted) {
      this.deleted = deleted;
  }

  // some other attributes, getters & setters

}

継承クラスのコード:

@Entity
@Table(name = "User")
@NamedQueries({
    @NamedQuery(name = "getAllUsers", query = "SELECT u FROM User u WHERE NOT u.deleted")
})
public class User extends BaseEntity {
    // some other fields and getter/setters
}

何が間違っているのか推測できますか?

編集:以下のコメントに従ってコードを更新しました。

4

2 に答える 2

0

ゲッターとセッターは重要だと思います。命名法についてはよくわかりませんが、「getIsDeleted()」または「isIsDeleted()」の方法である必要があります。

ブール値の名前を「deleted」に変更してみてください

更新:NOT を使用しないでください

SELECT u FROM User u WHERE u.deleted = FALSE

JPAに関するチュートリアルがあります

于 2012-05-15T06:55:00.347 に答える
0

実際には、テーブル「User」をクラス「Role」にマップしました。したがって、クエリは次のようになります。

@NamedQuery(name = "getAllUsers", query = "SELECT r FROM Role r WHERE NOT r.deleted")

Result : 削除された Role のリストを返す = false

于 2012-07-26T14:20:48.497 に答える