MySQL ndbcluster テーブルでエンティティを使用しようとしています。このテーブル タイプでは外部キーを使用できませんが、これまでのところ、私のエンティティでは問題はありませんでした。
ただし、EntityManager の createNativeQuery メソッドを使用してエンティティをロードしようとすると、少し問題が発生しました。これを行うことができないため、このメソッドを使用する必要があります:カスタムの「オン」条件で CriteriaBuilder を結合するにはどうすればよいですか?
私のMySQLテーブルは次のようになります。
CREATE TABLE `category` (
`id` SMALLINT(6) NOT NULL AUTO_INCREMENT,
`category_id` SMALLINT(6) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `category_id` (`category_id`)
)
COLLATE='utf8_general_ci'
ENGINE=ndbcluster
ROW_FORMAT=DEFAULT
テーブル エンジンを innodb に変更し、外部キーを追加すると、createNativeQuery メソッドが正常に機能します。
私のエンティティクラスは次のようになります:
@Entity
@Table(name = "category")
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Short id;
@OneToMany(mappedBy = "categoryId")
private List<Category> categoryList;
@JoinColumn(name = "category_id", referencedColumnName = "id")
@ManyToOne
private Category categoryId;
public Category() {
}
// getters and setters
}
外部キーがなくても、クエリに CriteriaBuilder を使用すると、このエンティティは正常に機能しますが、残念ながら CriteriaBuilder ですべてが可能というわけではありません。
createNativeQuery で作成された Query オブジェクトで getResultList を呼び出すと、エラーが発生します。これがバグなのか、これを機能させるためにエンティティ クラスに何かを追加する必要があるのかどうかはわかりません。
エラーは言う:
Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException
Exception Description: The primary key read from the row [ArrayRecord(
=> 2519
=> 2463
=> Tools)] during the execution of the query was detected to be null. Primary keys must not contain null.
Query: ReadAllQuery(referenceClass=Category sql="select * from `category`")
at org.eclipse.persistence.exceptions.QueryException.nullPrimaryKeyInBuildingObject(QueryException.java:895)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:584)
at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:560)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:717)
at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:769)
...
私のテーブルには、id=1 および category_id=null の 1 つの行が含まれているため、エラーの内容にかかわらず、null 値を持つ主キーはありません。その行を削除するか、category_id=1 に設定すると、エラーは発生しません。
助けが必要です。