hi michael,

fixed the bogus sql bug.
please use the latest SqlQueryStatement from repository.

jakob

Michael Hart wrote:

Hi Jakob,



i did some tests with empty criteria and imo this works ok:



Oops... you're right - the example I gave was too minimal :-) Here's a better one:


Criteria main_crit = new Criteria();
main_crit.setAlias("project");
Criteria persons_crit = new Criteria();
persons_crit.setAlias("persons");
persons_crit.addEqualTo("persons.id","2");


main_crit.addAndCriteria(persons_crit);

Query query = new QueryByCriteria(Project.class, main_crit);


Generates this:


SELECT A0.TITLE,A0.DESCRIPTION,A0.ID
FROM PROJECT A0
INNER JOIN PERSON_PROJECT A1 ON A0.ID=A1.PROJECT_ID
INNER JOIN PERSON A2 ON A1.PERSON_ID=A2.ID
WHERE A4.ID = 2

In the previous code snippet, if you don't set the alias for main_crit, then
it works fine. However, I got some weird results with other combinations and
it took me quite a while to realise that the name you give in the alias
makes quite a difference (as you may have hinted at in one of your previous
e-mails). For example:


Criteria main_crit = new Criteria();


Criteria roles_crit = new Criteria();
roles_crit.setAlias("roles");
roles_crit.addEqualTo("roles.roleName","whatever");
main_crit.addAndCriteria(roles_crit);
Query query = new QueryByCriteria(Person.class, main_crit);


Works fine, but changing the setAlias line to:


roles_crit.setAlias("roles1");

generates this bogus SQL:

SELECT A0.LASTNAME,A0.FIRSTNAME,A0.ID
FROM PERSON A0
INNER JOIN PERSON_PROJECT A1 ON A0.ID=A1.PERSON_ID
WHERE A2.ROLENAME = 'whatever'

But then adding another one (with a different alias) works (!):


Criteria main_crit = new Criteria();


Criteria roles_crit = new Criteria();
roles_crit.setAlias("roles");
roles_crit.addEqualTo("roles.roleName","whatever");
main_crit.addAndCriteria(roles_crit);

Criteria roles2_crit = new Criteria();
roles2_crit.setAlias("roles2");
roles2_crit.addEqualTo("roles.roleName","hello");
main_crit.addAndCriteria(roles2_crit);
Query query = new QueryByCriteria(Person.class, main_crit);


Note that if roles_crit is removed, or its setAlias changed, then it breaks again. In this example, as long as you have the first Criteria with an alias "roles", then you can add other Criteria with whatever alias you want.

This is also true for other aliases to other classes:


Criteria main_crit = new Criteria();


Criteria roles_crit = new Criteria();
roles_crit.setAlias("roles");
roles_crit.addEqualTo("roles.roleName","whatever");
main_crit.addAndCriteria(roles_crit);

Criteria proj_crit = new Criteria();
proj_crit.setAlias("projects1");
proj_crit.addEqualTo("projects.id","2");
main_crit.addAndCriteria(proj_crit);
Query query = new QueryByCriteria(Person.class, main_crit);


Works fine, and likewise so does:



Criteria main_crit = new Criteria();


Criteria proj_crit = new Criteria();
proj_crit.setAlias("projects");
proj_crit.addEqualTo("projects.id","2");
main_crit.addAndCriteria(proj_crit);

Criteria roles2_crit = new Criteria();
roles2_crit.setAlias("roles2");
roles2_crit.addEqualTo("roles.roleName","hello");
main_crit.addAndCriteria(roles2_crit);
Query query = new QueryByCriteria(Person.class, main_crit);


In any of the previous examples, if main_crit.setAlias is invoked, it breaks again, unless of course you add a criteria to it, eg main_crit.addLike(...).

Very confused :-)

Michael


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to