web-dev-qa-db-ja.com

JPQLで整数を文字列にキャストする

次のようなJPQLクエリが必要です。

    entityManager.createQuery("Select a.* from A a WHERE CAST(a.num AS TEXT) LIKE '%345%' ", A.class);

ここで、a.numは整数です。これをStringにキャストして、LIKE基準を使用したいと思います。ただし、上記のキャストはJPQLでは機能しません。これを実装するにはどうすればよいですか?

9
Pratap

あなたはもっと具体的に言えますか、あなたの問題は何ですか?何らかのエラーがありますか、それともクエリの結果が間違っていますか?

このコードは私にとってはうまくいくので:

session.createQuery("from MyObject where CAST(id as text) like :id").setParameter("id", "%1").getResultList();

Hibernate 5.2とPostgresql 9.5を使用しています。また、何が問題かを理解するのに問題がある場合は、次のような方法で、hibernate.cfg.xmlまたはHibernateが送信するクエリを作成するために使用している構成ファイルを編集してみてください。

<property name="hibernate.show_sql">true</property>
3
Stas Shafeev

私も同じ必要があります。これは、JPA 2.0およびHibernate 5.0.2で動作するはずです。

entityManager.createQuery(
    "Select a.* from A a WHERE CONCAT(a.num, '') LIKE '%345%' ", A.class);
4
Hendy Irawan

to_char()関数をselect句で使用できますが、_a.num_ではなく、すべての_*_フィールドを個別に選択する必要があります。

そしてpostgresqlではto_char() functionのマスクを指定する必要があるため、to_char(field, mask)になります。たとえば、可能な最大桁数を受け入れるためのマスクとして_'FM999999999999999999'_を指定できます。

クエリは次のようになります。

_Select *, to_char(a.num, 'FM999999999999999999') as num from A a WHERE num LIKE '%345%'
_

詳細については、 PostgresqlData Type Formatting Functions を参照してください。

EntityManagerを使用してコードにクエリを書き込むには、.createNativeQuery()メソッドを使用してネイティブクエリを作成できます。これがコードの例です。

_em.createNativeQuery("Select *, to_char(a.num, 'FM999999999999999999') as num from A a WHERE num LIKE '%345%'");
_
0
cнŝdk

正しいクエリは次のとおりです。

0
Pratap

Hibernateドキュメントから、 "cast(... as ...)"。2番目の引数はHibernateタイプの名前です。 Hibernate Types のリストによると、これはstringでなければなりません(大文字と小文字が区別されます!)。

したがって、リクエストは次のようになります。

entityManager.createQuery("select a.* from A a WHERE CAST(a.num AS string) LIKE '%345%' ", A.class);

原因:org.hibernate.QueryException:CASTの要求されたタイプを解決できませんでした:INT 回答。

0
Grigory Kislin