The "best way"? Well, I'd probably want to let somebody else do the hard work, so I'd use an ORM like Hibernate which supports building query objects with criteria. But check with a Hibernate person on this, as I'm just an Oracle bloke!
But I had to do something similar (i.e. the hard way) a while ago, and the approach I came up with was to use a simple XML snippet to pass the query parameters into the query procedure. Using an XML
string means you can just pass a VARCHAR2 or CLOB parameter, instead of having to mess about constructing and unpacking arrays of structured objects etc. This reduces the coupling between the Java and Oracle code, and it will be easier to change it later when you discover all the holes in your original design

. Also, Java is good at XML, and there are some useful XML tools in Oracle e.g. the DBMS_XMLDOM package to help you extract info from XML on the DB side as well.
Unfortunately, I don't have a copy of the XML format or the code I used for this, so I can only offer a few tips here.
You'll need to work out what your individual conditions look like e.g. [column][operator][value] and try to simplify things so that these are fairly standard e.g. your "contains", "starts with" and "ends with" operators are all variations on LIKE. Create some kind of XML format for a single query condition that meets your needs (or see if you can find one on the web).
As for NOT, AND and OR, you can do this by wrapping the relevant conditions in the <NOT>, <AND> or <OR> tags, something like this:
This would be the equivalent of "WHERE ( ( (condition 1) AND NOT (condition 2) ) OR (condition 3) )".
So you would construct the XML snippet in your Java interface, based on the user's chosen selection criteria, then pass it into the PL/SQL as a CLOB or VARCHAR2 parameter. Inside PL/SQL you can build a generic "query-converter" function that will take the XML and return a properly formatted SQL WHERE clause that you can then use in a normal query e.g. build the complete SQL query string and execute it with a REF CURSOR.
Make sure you put in plenty of brackets around your conditions when you convert them to a WHERE clause, as shown above, as it will help you to keep track of the logic. Also, be careful of things like quotes, upper/lower case, etc.
If you keep your XML format and your queries simple, something like this will probably do what you want without being too hard to maintain.
Of course, there are also tools like
XQuery, but this is aimed more at querying XML documents rather than normal DB tables.
But if I were you, I'd really think about using a standard tool like Hibernate instead.