String filteringTag = "habr" ; Session session = ... ; Criteria criteria = session. createCriteria ( StringArrayContainer. class ) ; criteria. add ( new StringArrayContainsCriterion ( "tags" , filteringTag ) ) ; List containers = criteria. list ( ) ; // , "habr" ...
String filteringTag = "habr" ; Session session = ... ; Criteria criteria = session. createCriteria ( StringArrayContainer. class ) ; criteria. add ( new StringArrayContainsCriterion ( "tags" , filteringTag ) ) ; List containers = criteria. list ( ) ; // , "habr" ...
String filteringTag = "habr" ; Session session = ... ; Criteria criteria = session. createCriteria ( StringArrayContainer. class ) ; criteria. add ( new StringArrayContainsCriterion ( "tags" , filteringTag ) ) ; List containers = criteria. list ( ) ; // , "habr" ...
String filteringTag = "habr" ; Session session = ... ; Criteria criteria = session. createCriteria ( StringArrayContainer. class ) ; criteria. add ( new StringArrayContainsCriterion ( "tags" , filteringTag ) ) ; List containers = criteria. list ( ) ; // , "habr" ...
String filteringTag = "habr" ; Session session = ... ; Criteria criteria = session. createCriteria ( StringArrayContainer. class ) ; criteria. add ( new StringArrayContainsCriterion ( "tags" , filteringTag ) ) ; List containers = criteria. list ( ) ; // , "habr" ...
String filteringTag = "habr" ; Session session = ... ; Criteria criteria = session. createCriteria ( StringArrayContainer. class ) ; criteria. add ( new StringArrayContainsCriterion ( "tags" , filteringTag ) ) ; List containers = criteria. list ( ) ; // , "habr" ...
最初に、検索条件のユニバーサル実装を作成します。 これを行うには、StringArrayCustomType.nullSafeGetメソッドとStringArrayCustomType.nullSafeSetメソッドを少し変更します。つまり、列に格納されている値をスペースで囲みます。 (7行目と25行目の変更)
- @Override
- public Object nullSafeGet ( ResultSet rs、 String [ ] names、 Object owner ) throws HibernateException、 SQLException {
- 文字列値= ( 文字列 )休止状態。 テキスト nullSafeGet ( rs、names [ 0 ] ) ;
- if ( value == null ) {
- nullを 返し ます 。
- } else {
- 文字列 [ ]配列= StringUtils。 split (値。trim ( ) '' ) ;
- for ( int i = 0 ; i <配列の長さ ; i ++ ) {
- 配列[ i ] = WhitespaceEscapeUtil。 unescape (配列[ i ] ) ;
- }
- 配列を返し ます。
- }
- }
- @Override
- public void nullSafeSet ( PreparedStatement st、 Object value、 int index ) throws HibernateException、 SQLException {
- if ( value == null ) {
- 休止状態 テキスト nullSafeSet ( st、 null 、index ) ;
- } else {
- 文字列 [ ]配列= ( 文字列 [ ] )値;
- 文字列 [ ] copy = 新しい 文字列 [配列。 長さ ] ;
- for ( int i = 0 ; i <配列の長さ ; i ++ ) {
- copy [ i ] = WhitespaceEscapeUtil。 escape (配列[ i ] ) ;
- }
- 休止状態 テキスト nullSafeSet ( st、 '' + StringUtils。join ( copy、 '' ) + '' 、index ) ;
- }
- }
ここで、org.hibernate.criterion.Criterionインターフェースを慎重に実装します。
likeによる実装は、生産性の観点からはあまり効果的ではないことを明確に示します。 最適化のために、PostgreSQL 8.xの機能を使用して同じことを記述します。
- パブリック クラス GenericStringArrayContainsCriterion extends LikeExpression {
- public GenericStringArrayContainsCriterion ( String propertyName、 String value ) {
- super ( propertyName、 "%" + WhitespaceEscapeUtil。escape ( value ) + "%" )
- }
- }
そして、「戦略」テンプレートを使用して、現在の方言に応じて実装を選択します。
- パブリック クラス PostgresStringArrayContainsCriterion は Criterion {
- プライベート 最終 文字列 propertyName ;
- プライベート 最終 文字列値。
- private final String TEMPLATE = "to_tsvector( 'simple'、{column})@@ plainto_tsquery( 'simple' ,?)" ;
- private static final char TAG_SEPARATOR = '' ;
- public PostgresStringArrayContainsCriterion ( String propertyName、 String value ) {
- これ 。 propertyName = propertyName ;
- これ 。 値 = WhitespaceEscapeUtil。 エスケープ (値) ;
- }
- public String toSqlString ( Criteria criteria、CriteriaQuery criteriaQuery ) throws HibernateException {
- StringHelperを返します。 replace ( TEMPLATE、 "{column}" 、criteriaQuery。getColumn ( criteria、propertyName ) ) ;
- }
- public TypedValue [ ] getTypedValues ( Criteria criteria、CriteriaQuery criteriaQuery ) throws HibernateException {
- return new TypedValue [ ] { new TypedValue ( Hibernate。STRING、value、EntityMode。POJO ) } ;
- }
- }
- パブリック クラス StringArrayContainsCriterion は Criterion {
- プライベート 最終 文字列 propertyName ;
- プライベート 最終 文字列値。
- public StringArrayContainsCriterion ( String propertyName、 String value ) {
- これ 。 propertyName = propertyName ;
- これ 。 値 =値;
- }
- public String toSqlString ( Criteria criteria、CriteriaQuery criteriaQuery ) throws HibernateException {
- getStrategy ( criteriaQuery.getFactory ( ) 。 getDialect ( ) )を 返します。 toSqlString ( criteria、criteriaQuery ) ;
- }
- public TypedValue [ ] getTypedValues ( Criteria criteria、CriteriaQuery criteriaQuery ) throws HibernateException {
- getStrategy ( criteriaQuery.getFactory ( ) 。 getDialect ( ) )を 返します。 getTypedValues ( criteria、criteriaQuery ) ;
- }
- 公開基準getStrategy (方言方言) {
- if ( PostgreSQLDialectの方言インスタンス ) {
- 新しい PostgresStringArrayContainsCriterion ( propertyName、value )を 返し ます。
- } else {
- 新しい GenericStringArrayContainsCriterion ( propertyName、value )を 返し ます。
- }
- }
- }
まあ、それがすべてです。 これで、カスタムタイプを保存およびフィルタリングできます。
______________________