@GET
  @Path("entityManager")
  @Produces(MediaType.APPLICATION_JSON)
  public String search(
      @QueryParam("sessionId") String sessionId,
      @QueryParam("query") String query,
      @QueryParam("id") Long id)
      throws IcatException {

    if (sessionId == null) {
      throw new IcatException(IcatExceptionType.BAD_PARAMETER, "sessionId is not set");
    }
    if (query == null) {
      throw new IcatException(IcatExceptionType.BAD_PARAMETER, "query is not set");
    }

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    JsonGenerator gen = Json.createGenerator(baos);

    String userName = beanManager.getUserName(sessionId, manager);
    if (id == null) {
      gen.writeStartArray();

      for (Object result : beanManager.search(userName, query, manager, userTransaction)) {
        if (result == null) {
          gen.writeNull();
        } else if (result instanceof EntityBaseBean) {
          gen.writeStartObject();
          gen.writeStartObject(result.getClass().getSimpleName());
          jsonise((EntityBaseBean) result, gen);
          gen.writeEnd();
          gen.writeEnd();
        } else if (result instanceof Long) {
          gen.write((Long) result);
        } else if (result instanceof Double) {
          if (Double.isNaN((double) result)) {
            gen.writeNull();
          } else {
            gen.write((Double) result);
          }
        } else if (result instanceof String) {
          gen.write((String) result);
        } else if (result instanceof Boolean) {
          gen.write((Boolean) result);
        } else {
          throw new IcatException(
              IcatException.IcatExceptionType.INTERNAL,
              "Don't know how to jsonise " + result.getClass());
        }
      }

      gen.writeEnd();
    } else {
      EntityBaseBean result = beanManager.get(userName, query, id, manager, userTransaction);
      gen.writeStartObject();
      gen.writeStartObject(result.getClass().getSimpleName());
      jsonise(result, gen);
      gen.writeEnd();
      gen.writeEnd();
    }

    gen.close();
    return baos.toString();
  }