You would do it the same way in a Java application:
String sql = "INSERT INTO location(address1, address2, postcode, town, type)";
+ " VALUES (:address1, :address2, :postcode, :town,"
+ " (SELECT id FROM location_type WHERE type='main'))";
Map parameters = new HashMap();
parameters.put("address1", address1);
parameters.put("address2", address2);
parameters.put("postcode", postcode);
parameters.put("town", town);
this.namedParameterJdbcTemplate.update(sql, parameters);
There's no reason the database accepts a SQL query from the command line and rejects it when it comes from a Java application.
If the hard-coded main above is in fact another parameter, you would set it the same way as all the other parameters:
String sql = "INSERT INTO location(address1, address2, postcode, town, type)";
+ " VALUES (:address1, :address2, :postcode, :town,"
+ " (SELECT id FROM location_type WHERE type= : type))";
Map parameters = new HashMap();
parameters.put("address1", address1);
parameters.put("address2", address2);
parameters.put("postcode", postcode);
parameters.put("town", town);
parameters.put("type", type);
this.namedParameterJdbcTemplate.update(sql, parameters);