kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

JPAでのSQLのIn句指定

Entityクラスに、@idのアノテーション(EmbeddedId)がある場合のSQLでのIn句指定

Entity クラス


@Entity
@Table(name = "TableName1")
@NamedQuery(name = "Entity.findAll", query = "SELECT t FROM TableName1 t")
public class Entity implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private EntityPK id;

}

エンティティのPKクラス


@Embeddable
public class EntityPK implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "CODE")
private String code;
@Column(name = "CODE2")
private long code2;

public EntityPK() {
}

}

SQL生成

	CriteriaBuilder cb = em.getCriteriaBuilder();
	CriteriaQuery<Entity> criteriaQuery = cb.createQuery(Entity.class);
	Root<Entity> entity = criteriaQuery.from(Entity.class);

        //idフィールドでidフィールドのクラスの中にある codeフィールドを指定する
	criteriaQuery.select(entity).where(entity.get("id").get("code").in(Array.asList(1,2,3));
	
	List<Entity> list = entityManager.createQuery(criteriaQuery).getResultList();

	System.out.println("list size=" + list.size());