Search code examples
javahibernatehqldynamicquery

dynamically Search Query in HQL with optional Parameter?


i am developing an application in which i need search functionality, i want to write HQL query that dynamically create according to parameters. Currently i have 4 parameters, while searching all parameters are required or 1 or 2 or 3 parameters required according to how user want to searchs.

public List<Plot> fetchSearchedPlots(int plotType, String plotSize, String min, String max)
    {
        Session session = sessionFactory.getCurrentSession();
        List<Plot> searchedLists = new ArrayList<Plot>();
        String query = "FROM Plot where type = ? and size = ? and price >= ? and price <= ?";
        searchedLists = (List<Plot>)session.createQuery( query )
                .setInteger( 0, plotType )
                .setString( 1, plotSize )
                .setString( 2, min )
                .setString( 3, max ).list();
        return searchedLists;
    }

this is my general query for all 4 parameters, now i have to write a search query in which i use multiple optional parameters, How to make this query with optional parameters? kindly convert my query to dynamically optional parameters query ? Thanks


Solution

  • I Converted query by myself like this

    Session session = sessionFactory.getCurrentSession();
            List<Plot> searchedLists = new ArrayList<Plot>();
            Map<String, Object> params = new HashMap<String,Object>();
            String hqlQuery = "from Plot where societyBlock.societyBlockId = :societyBlock";
            params.put( "societyBlock", societyId );
            if(plotType != null)
            {
                hqlQuery += " and type.typeId = :type";
                params.put( "type", plotType );
            }
            if(!plotSize.isEmpty() && plotSize != null && !plotSize.equals( "" ))
            {
                hqlQuery += " and size = :size";
                params.put( "size", plotSize );
            }
            if(min != null)
            {
                hqlQuery += " and price >= :pricemin";
                params.put( "pricemin", min );
            }
            if(max != null)
            {
                hqlQuery += " and price <= :pricemax";
                params.put( "pricemax", max );
            }
            Query query = session.createQuery( hqlQuery );
    
            for (String str : query.getNamedParameters())
            {
                query.setParameter( str, params.get( str ) );
            }
            searchedLists = (List<Plot>) query.list();
            System.out.println( searchedLists.size() );
            return searchedLists;