[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-5946) Wrong generated SQL when used composite user type in HQL with not equal operator

Emanuele Gesuato (JIRA) noreply at atlassian.com
Tue Feb 22 09:37:05 EST 2011


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-5946?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=40043#action_40043 ] 

Emanuele Gesuato commented on HHH-5946:
---------------------------------------

The patch is related to org.hibernate.hql.ast.tree.BinaryLogicOperatorNode.

> Wrong generated SQL when used composite user type in HQL with not equal operator
> --------------------------------------------------------------------------------
>
>                 Key: HHH-5946
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5946
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.6.1
>         Environment: hibernate version 3.6.1, databases db2 and oracle
>            Reporter: Emanuele Gesuato
>         Attachments: CompositeUserTypeTest.java, patch.txt
>
>
> If i use a not operator in a hql query using a composite user type (that uses at least two fields) the sql generated has an AND statement between the elements but i expect an OR instead.
> I have tried to reproduce a bug using an hibernate test case.
> In particular using the following class:
> {code:title=org.hibernate.test.cut.Transaction.java|borderStyle=solid}
> public class Transaction {
> 	private Long id;
> 	private String description;
> 	private MonetoryAmount value;
> 	
> 	public String getDescription() {
> 		return description;
> 	}
> 	
> 	public void setDescription(String description) {
> 		this.description = description;
> 	}
> 	
> 	public Long getId() {
> 		return id;
> 	}
> 	
> 	public void setId(Long id) {
> 		this.id = id;
> 	}
> 	
> 	public MonetoryAmount getValue() {
> 		return value;
> 	}
> 	
> 	public void setValue(MonetoryAmount value) {
> 		this.value = value;
> 	}
> }
> {code} 
> i've modified CompositeUserTypeTest.testCompositeUserType (present in hibernate tests) as following (added the last two lines inside if statement):
> {code:title=org.hibernate.test.cut.CompositeUserTypeTest.java|borderStyle=solid}
> 	public void testCompositeUserType() {
> 		Session s = openSession();
> 		org.hibernate.Transaction t = s.beginTransaction();
> 		
> 		Transaction tran = new Transaction();
> 		tran.setDescription("a small transaction");
> 		tran.setValue( new MonetoryAmount( new BigDecimal(1.5), Currency.getInstance("USD") ) );
> 		s.persist(tran);
> 		
> 		List result = s.createQuery("from Transaction tran where tran.value.amount > 1.0 and tran.value.currency = 'USD'").list();
> 		assertEquals( result.size(), 1 );
> 		tran.getValue().setCurrency( Currency.getInstance("AUD") );
> 		result = s.createQuery("from Transaction tran where tran.value.amount > 1.0 and tran.value.currency = 'AUD'").list();
> 		assertEquals( result.size(), 1 );
> 		
> 		if ( !(getDialect() instanceof HSQLDialect) ) {
> 		
> 			result = s.createQuery("from Transaction txn where txn.value = (1.5, 'AUD')").list();
> 			assertEquals( result.size(), 1 );
> 			result = s.createQuery("from Transaction where value = (1.5, 'AUD')").list();
> 			assertEquals( result.size(), 1 );
> 			result = s.createQuery("from Transaction where value != (1.4, 'AUD')").list();
> 			assertEquals( result.size(), 1 );
> 		}
> 		
> 		s.delete(tran);
> 		t.commit();
> 		s.close();
> 	}
> {code}
> the last assert should succeed because transaction (1.5, 'AUD') isn't equal to (1.4, 'AUD') and i should retrieve the (1.5, 'AUD') but the sql generated has an "AND" instead of an "OR":
> {code:title=Generated SQL|borderStyle=solid}
>     select
>         transactio0_.id as id0_,
>         transactio0_.description as descript2_0_,
>         transactio0_.amount as amount0_,
>         transactio0_.currency as currency0_ 
>     from
>         Trnsctn transactio0_ 
>     where
>         transactio0_.amount<>1.4 
>         and transactio0_.currency<>'AUD'
> {code}
> In attachment i provide a patch and the full modified test case.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list