Spring Boot の HQL とは何か、およびその使用方法
導入
Web アプリケーションを開発するとき、多くの場合、データベースのデータをクエリする必要があります。Spring Boot にはデータをクエリするための複数の方法が用意されており、その 1 つは HQL (Hibernate Query Language) を使用することです。HQL はオブジェクト指向のクエリ言語で、SQL に似ていますが、より柔軟で強力です。この記事では、HQL の基本的な使用法をコード例とともに紹介し、読者が HQL 言語をよりよく理解して使用できるようにします。
HQLとは何ですか?
HQL (Hibernate Query Language) は Hibernate フレームワークのクエリ言語であり、SQL と同様にオブジェクトのクエリに使用されます。SQL とは異なり、HQL はテーブルではなくオブジェクトを直接操作できるオブジェクトベースのクエリ言語です。HQL は、単一オブジェクトのクエリ、複数オブジェクトのクエリ、ページング クエリ、並べ替えなどのさまざまなクエリ操作をサポートします。HQL を使用すると、クエリ操作をより柔軟かつ強力にすることができます。
HQLの使い方は?
HQL を使用する前に、Hibernate を設定する必要があります。具体的な設定方法については、Spring Boot の公式ドキュメントを参照してください。次に、DAO レイヤーで HQL を使用してデータをクエリできます。簡単な例を次に示します。
@Repository
public class UserDao {
@Autowired
private EntityManager entityManager;
public User findById(Long id) {
String hql = "from User where id = :id";
TypedQuery<User> query = entityManager.createQuery(hql, User.class);
query.setParameter("id", id);
return query.getSingleResult();
}
public List<User> findAll() {
String hql = "from User";
TypedQuery<User> query = entityManager.createQuery(hql, User.class);
return query.getResultList();
}
}
上の例では、UserDao という名前の DAO クラスを定義しました。このクラスでは、findById メソッドと findAll メソッドを使用して、それぞれ単一ユーザーとすべてのユーザーをクエリします。どちらの方法でも、HQL を使用してデータをクエリしました。HQL を実行するには、JdbcTemplate や他のメソッドを使用するのではなく、EntityManager オブジェクトを使用することに注意してください。
以下は、ページング クエリと並べ替えに HQL を使用する方法を示す、より複雑な例です。
@Repository
public class UserDao {
@Autowired
private EntityManager entityManager;
public Page<User> findPage(int pageNo, int pageSize, String sortField, boolean ascending) {
String hql = "select u from User u order by u." + sortField + (ascending ? " asc" : " desc");
TypedQuery<User> query = entityManager.createQuery(hql, User.class);
query.setFirstResult((pageNo - 1) * pageSize);
query.setMaxResults(pageSize);
List<User> resultList = query.getResultList();
long totalCount = count();
return new PageImpl<>(resultList, PageRequest.of(pageNo - 1, pageSize), totalCount);
}
public long count() {
String hql = "select count(*) from User";
TypedQuery<Long> query = entityManager.createQuery(hql, Long.class);
return query.getSingleResult();
}
}
上の例では、UserDao という名前の DAO クラスを定義しました。このクラスでは、findPage メソッドを使用してページング クエリを実行し、count メソッドを使用してレコードの総数をクエリします。findPage メソッドでは、クエリの並べ替えとページングに HQL を使用します。ページング情報を表すために Pageable オブジェクトを使用し、クエリ結果を表すために PageImpl オブジェクトを使用することに注意してください。
コード例
以下は、クエリとページネーションに HQL を使用する方法を示す完全な例です。
エンティティクラス:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
// 省略 getter 和 setter 方法
}
DAOクラス:
@Repository
public class UserDao {
@Autowired
private EntityManager entityManager;
public User findById(Long id) {
String hql = "from User where id = :id";
TypedQuery<User> query = entityManager.createQuery(hql, User.class);
query.setParameter("id", id);
return query.getSingleResult();
}
public List<User> findAll() {
String hql = "from User";
TypedQuery<User> query = entityManager.createQuery(hql, User.class);
return query.getResultList();
}
public Page<User> findPage(int pageNo, int pageSize, String sortField, boolean ascending) {
String hql = "select u from User u order by u." + sortField + (ascending ? " asc" : " desc");
TypedQuery<User> query = entityManager.createQuery(hql, User.class);
query.setFirstResult((pageNo - 1) * pageSize);
query.setMaxResults(pageSize);
List<User> resultList = query.getResultList();
long totalCount = count();
return new PageImpl<>(resultList, PageRequest.of(pageNo - 1, pageSize), totalCount);
}
public long count() {
String hql = "select count(*) from User";
TypedQuery<Long> query = entityManager.createQuery(hql, Long.class);
return query.getSingleResult();
}
}
コントローラークラス:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserDao userDao;
@GetMapping("/{id}")
public User findById(@PathVariable Long id) {
return userDao.findById(id);
}
@GetMapping
public List<User> findAll() {
return userDao.findAll();
}
@GetMapping("/page")
public Page<User> findPage(@RequestParam int pageNo, @RequestParam int pageSize, @RequestParam String sortField, @RequestParam boolean ascending) {
return userDao.findPage(pageNo, pageSize, sortField, ascending);
}
}
上の例では、UserController クラスを定義しました。このクラスでは、findById、findAll、および findPage メソッドを使用して、それぞれ単一ユーザーのクエリ、すべてのユーザーのクエリ、およびページング クエリの実行が行われます。findPage メソッドでは、クエリの並べ替えとページングに HQL を使用します。ページング情報を表すために Pageable オブジェクトを使用し、クエリ結果を表すために PageImpl オブジェクトを使用することに注意してください。
要約する
この記事では、Spring Boot の HQL について紹介し、HQL の基本的な使い方とサンプルコードを説明します。HQL を使用すると、データベース内のデータをより柔軟かつ強力にクエリできます。HQL を使用する場合は、Hibernate を構成する必要があり、HQL を実行するには EntityManager オブジェクトを正しく使用する必要があることに注意してください。この記事が読者のお役に立てば幸いです。