2016-08-17 11 views
0

私はJava Web Applicationpostgresqlデータベースとhibernateを使用しています。私はテーブルcontentscontent_dataをテキストフィールドとして持っています。その対応POJOContentTOという名前とデータベースフィールドcontent_dataためcontentDataと、次のフィールドがありますされています パブリッククラスContentTOpostgresqlのデータベーステーブルフィールドで複数の文字列を検索するHQLクエリ

{ 
    private int contentId; 
    private String contentData; 
    private int applicationId; 
    private int siteId; 
    private int userCreated; 
    private int userModified; 
    private Date createdTime; 
    private Date updatedTime; 
} 

私は次のメソッドを持っている:

public List<ContentTO> listContentsBySearchStrings(String searchData, int applicationId, int siteId) throws HibernateException 
    { 
     Query query = getCurrentSession().createQuery("ContentTO where siteId = :siteId and lower(contentData) LIKE :searchString "); 
     query.setParameter("siteId", siteId); 
     query.setParameter("applicationId", applicationId); 
     query.setParameter("searchString", "%"+searchData+"%"); 
     List<ContentTO> resultsList = query.list(); 
     if(resultsList != null && ! resultsList.isEmpty()) 
     { 
      return resultsList; 
     } 
     return new ArrayList<ContentTO>(); 
    } 

場合にのみ、このメソッドは動作します単一の文字列がフィールド内で検索されます。渡されたパラメータでコンマ区切りの複数の文字列を検索しようとしています。

また、私は、クエリをテストするには、以下のSQLを試してみました:

SELECT * FROM contents 
WHERE content_data LIKE '%mydata' 
    AND content_data LIKE '%testdata' 
    AND content_data LIKE '%totest'; 

は、パラメータはカンマで区切られた文字列である場合は、この使用してHQLを行うにはどのような方法があります。

+1

**を "しかし、このクエリはcontent_dataがmydata1234が含まれている場合でも行を戻しますする方法はありますこれを行うにはhqlを使用してください。 "** あなたの' content_data LIKE '%mydata%' '条件がmysqlのために1234と一致するので、それはそのデータを返します。 –

+0

@sumitbadaya、ありがとう、私は質問を更新しました –

+0

まだ不明です。具体的な例として、2行または3行と、変数に含まれるものと、クエリが返すものとを示します。しかし、一般的に、カンマで区切られた文字列を列に格納する場合は、それを行わずにOneToManyまたはElementCollectionを持つ別のテーブルを使用します。あなたの変数にコンマ区切りの文字列がある場合は、それを行わずに、リストまたはセットを代わりに渡します。 –

答えて

0

あなたは、パラメータが、あなたの場合は文字列のリストである「IN」を使用することができます。

...where content_data in (:listOfYourStrings) 
関連する問題