Skip to content

Commit e84aae2

Browse files
committed
HHH-10603 Avoid doing distinct and comparisons on byte arrays
They are stored as blobs starting with Oracle12cDialect and distinct and comparisons on blobs are not supported. Some tests were adapted, some are now skipped with Oracle12cDialect.
1 parent f43f668 commit e84aae2

File tree

7 files changed

+203
-39
lines changed

7 files changed

+203
-39
lines changed

hibernate-core/src/test/java/org/hibernate/jpa/test/criteria/MultiTypedBasicAttributesEntity.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ public class MultiTypedBasicAttributesEntity {
2626
@GeneratedValue( generator = "increment" )
2727
@GenericGenerator( name = "increment", strategy = "increment" )
2828
private Long id;
29-
private byte[] someBytes;
30-
private Byte[] someWrappedBytes;
29+
private int[] someInts;
30+
private Integer[] someWrappedIntegers;
3131

3232
public Long getId() {
3333
return id;
@@ -37,19 +37,19 @@ public void setId(Long id) {
3737
this.id = id;
3838
}
3939

40-
public byte[] getSomeBytes() {
41-
return someBytes;
40+
public int[] getSomeInts() {
41+
return someInts;
4242
}
4343

44-
public void setSomeBytes(byte[] someBytes) {
45-
this.someBytes = someBytes;
44+
public void setSomeInts(int[] someInts) {
45+
this.someInts = someInts;
4646
}
4747

48-
public Byte[] getSomeWrappedBytes() {
49-
return someWrappedBytes;
48+
public Integer[] getSomeWrappedIntegers() {
49+
return someWrappedIntegers;
5050
}
5151

52-
public void setSomeWrappedBytes(Byte[] someWrappedBytes) {
53-
this.someWrappedBytes = someWrappedBytes;
52+
public void setSomeWrappedIntegers(Integer[] someWrappedIntegers) {
53+
this.someWrappedIntegers = someWrappedIntegers;
5454
}
5555
}

hibernate-core/src/test/java/org/hibernate/jpa/test/criteria/ParameterTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ public void testPrimitiveArrayParameterBinding() {
4040
CriteriaQuery<MultiTypedBasicAttributesEntity> criteria = em.getCriteriaBuilder()
4141
.createQuery( MultiTypedBasicAttributesEntity.class );
4242
Root<MultiTypedBasicAttributesEntity> rootEntity = criteria.from( MultiTypedBasicAttributesEntity.class );
43-
Path<byte[]> someBytesPath = rootEntity.get( MultiTypedBasicAttributesEntity_.someBytes );
44-
ParameterExpression<byte[]> param = em.getCriteriaBuilder().parameter( byte[].class, "theBytes" );
45-
criteria.where( em.getCriteriaBuilder().equal( someBytesPath, param ) );
43+
Path<int[]> someIntsPath = rootEntity.get( MultiTypedBasicAttributesEntity_.someInts );
44+
ParameterExpression<int[]> param = em.getCriteriaBuilder().parameter( int[].class, "theInts" );
45+
criteria.where( em.getCriteriaBuilder().equal( someIntsPath, param ) );
4646
TypedQuery<MultiTypedBasicAttributesEntity> query = em.createQuery( criteria );
47-
query.setParameter( param, new byte[] { 1,1,1 } );
48-
assertThat( query.getParameterValue( param.getName() ), instanceOf( byte[].class) );
47+
query.setParameter( param, new int[] { 1,1,1 } );
48+
assertThat( query.getParameterValue( param.getName() ), instanceOf( int[].class) );
4949
query.getResultList();
5050
em.getTransaction().commit();
5151
em.close();
@@ -58,12 +58,12 @@ public void testNonPrimitiveArrayParameterBinding() {
5858
CriteriaQuery<MultiTypedBasicAttributesEntity> criteria = em.getCriteriaBuilder()
5959
.createQuery( MultiTypedBasicAttributesEntity.class );
6060
Root<MultiTypedBasicAttributesEntity> rootEntity = criteria.from( MultiTypedBasicAttributesEntity.class );
61-
Path<Byte[]> thePath = rootEntity.get( MultiTypedBasicAttributesEntity_.someWrappedBytes );
62-
ParameterExpression<Byte[]> param = em.getCriteriaBuilder().parameter( Byte[].class, "theBytes" );
61+
Path<Integer[]> thePath = rootEntity.get( MultiTypedBasicAttributesEntity_.someWrappedIntegers );
62+
ParameterExpression<Integer[]> param = em.getCriteriaBuilder().parameter( Integer[].class, "theIntegers" );
6363
criteria.where( em.getCriteriaBuilder().equal( thePath, param ) );
6464
TypedQuery<MultiTypedBasicAttributesEntity> query = em.createQuery( criteria );
65-
query.setParameter( param, new Byte[] { Byte.valueOf((byte)1), Byte.valueOf((byte)1), Byte.valueOf((byte)1) } );
66-
assertThat( query.getParameterValue( param.getName() ), instanceOf( Byte[].class ) );
65+
query.setParameter( param, new Integer[] { Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1) } );
66+
assertThat( query.getParameterValue( param.getName() ), instanceOf( Integer[].class ) );
6767
query.getResultList();
6868
em.getTransaction().commit();
6969
em.close();

hibernate-core/src/test/java/org/hibernate/jpa/test/criteria/basic/PredicateTest.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,32 @@
66
*/
77
package org.hibernate.jpa.test.criteria.basic;
88

9+
import static org.junit.Assert.assertEquals;
10+
import static org.junit.Assert.assertTrue;
11+
912
import java.util.List;
13+
1014
import javax.persistence.EntityManager;
1115
import javax.persistence.criteria.CriteriaBuilder;
1216
import javax.persistence.criteria.CriteriaQuery;
1317
import javax.persistence.criteria.Path;
1418
import javax.persistence.criteria.Predicate;
1519
import javax.persistence.criteria.Root;
1620

17-
import org.junit.Before;
18-
import org.junit.Test;
19-
21+
import org.hibernate.dialect.Oracle12cDialect;
22+
import org.hibernate.dialect.Oracle8iDialect;
23+
import org.hibernate.dialect.Oracle9Dialect;
24+
import org.hibernate.dialect.OracleDialect;
2025
import org.hibernate.jpa.test.metamodel.AbstractMetamodelSpecificTest;
2126
import org.hibernate.jpa.test.metamodel.CreditCard;
2227
import org.hibernate.jpa.test.metamodel.CreditCard_;
2328
import org.hibernate.jpa.test.metamodel.Customer_;
2429
import org.hibernate.jpa.test.metamodel.Order;
2530
import org.hibernate.jpa.test.metamodel.Order_;
26-
31+
import org.hibernate.testing.SkipForDialect;
2732
import org.hibernate.testing.TestForIssue;
28-
29-
import static org.junit.Assert.assertEquals;
30-
import static org.junit.Assert.assertTrue;
33+
import org.junit.Before;
34+
import org.junit.Test;
3135

3236
/**
3337
* Test the various predicates.
@@ -211,7 +215,7 @@ public void testCharArray() {
211215
em.getTransaction().begin();
212216
CriteriaQuery<Order> orderCriteria = builder.createQuery( Order.class );
213217
Root<Order> orderRoot = orderCriteria.from( Order.class );
214-
218+
215219
orderCriteria.select( orderRoot );
216220
Predicate p = builder.equal( orderRoot.get( "domen" ), new char[]{'r','u'} );
217221
orderCriteria.where( p );
@@ -223,15 +227,17 @@ public void testCharArray() {
223227
}
224228

225229
/**
226-
* Check predicate for field which has simple char array type (byte[]).
230+
* Check predicate for field which has simple byte array type (byte[]).
227231
*/
228232
@Test
233+
@SkipForDialect(value = Oracle12cDialect.class, jiraKey = "HHH-10603",
234+
comment = "Oracle12cDialect uses blob to store byte arrays and it's not possible to compare blobs with simple equality operators.")
229235
public void testByteArray() {
230236
EntityManager em = getOrCreateEntityManager();
231237
em.getTransaction().begin();
232238
CriteriaQuery<Order> orderCriteria = builder.createQuery( Order.class );
233239
Root<Order> orderRoot = orderCriteria.from( Order.class );
234-
240+
235241
orderCriteria.select( orderRoot );
236242
Predicate p = builder.equal( orderRoot.get( "number" ), new byte[]{'1','2'} );
237243
orderCriteria.where( p );

hibernate-core/src/test/java/org/hibernate/jpa/test/criteria/paths/ImplicitJoinTest.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,19 @@
1313
import javax.persistence.criteria.Join;
1414
import javax.persistence.criteria.Root;
1515

16-
import org.hibernate.jpa.test.metamodel.AbstractMetamodelSpecificTest;
17-
import org.hibernate.jpa.test.metamodel.LineItem;
18-
import org.hibernate.jpa.test.metamodel.LineItem_;
19-
import org.hibernate.jpa.test.metamodel.Order;
20-
import org.hibernate.jpa.test.metamodel.Order_;
21-
16+
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
2217
import org.junit.Test;
2318

2419
/**
2520
* @author Steve Ebersole
2621
*/
27-
public class ImplicitJoinTest extends AbstractMetamodelSpecificTest {
22+
public class ImplicitJoinTest extends BaseEntityManagerFunctionalTestCase {
23+
24+
@Override
25+
protected Class<?>[] getAnnotatedClasses() {
26+
return new Class<?>[] { Order.class, LineItem.class };
27+
}
28+
2829
@Test
2930
public void testImplicitJoinFromExplicitCollectionJoin() {
3031
EntityManager em = getOrCreateEntityManager();
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
package org.hibernate.jpa.test.criteria.paths;
8+
9+
import javax.persistence.Column;
10+
import javax.persistence.Entity;
11+
import javax.persistence.Id;
12+
import javax.persistence.JoinColumn;
13+
import javax.persistence.ManyToOne;
14+
import javax.persistence.Table;
15+
16+
@Entity
17+
@Table(name = "LINEITEM_TABLE")
18+
public class LineItem {
19+
20+
private String id;
21+
private int quantity;
22+
private Order order;
23+
24+
public LineItem() {
25+
}
26+
27+
public LineItem(String v1, int v2, Order v3) {
28+
id = v1;
29+
quantity = v2;
30+
order = v3;
31+
}
32+
33+
public LineItem(String v1, int v2) {
34+
id = v1;
35+
quantity = v2;
36+
}
37+
38+
@Id
39+
@Column(name = "ID")
40+
public String getId() {
41+
return id;
42+
}
43+
44+
public void setId(String v) {
45+
id = v;
46+
}
47+
48+
@Column(name = "QUANTITY")
49+
public int getQuantity() {
50+
return quantity;
51+
}
52+
53+
public void setQuantity(int v) {
54+
quantity = v;
55+
}
56+
57+
@ManyToOne
58+
@JoinColumn(name = "FK1_FOR_ORDER_TABLE")
59+
public Order getOrder() {
60+
return order;
61+
}
62+
63+
public void setOrder(Order v) {
64+
order = v;
65+
}
66+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
package org.hibernate.jpa.test.criteria.paths;
8+
9+
import java.util.Collection;
10+
11+
import javax.persistence.CascadeType;
12+
import javax.persistence.Column;
13+
import javax.persistence.Entity;
14+
import javax.persistence.Id;
15+
import javax.persistence.JoinColumn;
16+
import javax.persistence.OneToMany;
17+
import javax.persistence.OneToOne;
18+
import javax.persistence.Table;
19+
20+
@Entity
21+
@Table(name = "ORDER_TABLE")
22+
public class Order {
23+
24+
private String id;
25+
private double totalPrice;
26+
private LineItem sampleLineItem;
27+
private Collection<LineItem> lineItems = new java.util.ArrayList<LineItem>();
28+
29+
public Order() {
30+
}
31+
32+
public Order(String id, double totalPrice) {
33+
this.id = id;
34+
this.totalPrice = totalPrice;
35+
}
36+
37+
public Order(String id) {
38+
this.id = id;
39+
}
40+
41+
// ====================================================================
42+
// getters and setters for State fields
43+
44+
@Id
45+
@Column(name = "ID")
46+
public String getId() {
47+
return id;
48+
}
49+
50+
public void setId(String id) {
51+
this.id = id;
52+
}
53+
54+
@Column(name = "TOTALPRICE")
55+
public double getTotalPrice() {
56+
return totalPrice;
57+
}
58+
59+
public void setTotalPrice(double price) {
60+
this.totalPrice = price;
61+
}
62+
63+
// ====================================================================
64+
// getters and setters for Association fields
65+
66+
// 1x1
67+
68+
@OneToOne(cascade = CascadeType.REMOVE)
69+
@JoinColumn(name = "FK0_FOR_LINEITEM_TABLE")
70+
public LineItem getSampleLineItem() {
71+
return sampleLineItem;
72+
}
73+
74+
public void setSampleLineItem(LineItem l) {
75+
this.sampleLineItem = l;
76+
}
77+
78+
// 1xMANY
79+
80+
@OneToMany(cascade = CascadeType.ALL, mappedBy = "order")
81+
public Collection<LineItem> getLineItems() {
82+
return lineItems;
83+
}
84+
85+
public void setLineItems(Collection<LineItem> c) {
86+
this.lineItems = c;
87+
}
88+
}

hibernate-core/src/test/java/org/hibernate/test/legacy/FooBarTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.hibernate.dialect.InterbaseDialect;
5454
import org.hibernate.dialect.MckoiDialect;
5555
import org.hibernate.dialect.MySQLDialect;
56+
import org.hibernate.dialect.Oracle12cDialect;
5657
import org.hibernate.dialect.Oracle8iDialect;
5758
import org.hibernate.dialect.PointbaseDialect;
5859
import org.hibernate.dialect.PostgreSQL81Dialect;
@@ -1645,7 +1646,7 @@ public void testLimit() throws Exception {
16451646
count++;
16461647
}
16471648
assertEquals(4, count);
1648-
iter = s.createQuery("select distinct foo from Foo foo")
1649+
iter = s.createQuery("select foo from Foo foo")
16491650
.setMaxResults(2)
16501651
.setFirstResult(2)
16511652
.list()
@@ -1656,7 +1657,7 @@ public void testLimit() throws Exception {
16561657
count++;
16571658
}
16581659
assertTrue(count==2);
1659-
iter = s.createQuery("select distinct foo from Foo foo")
1660+
iter = s.createQuery("select foo from Foo foo")
16601661
.setMaxResults(3)
16611662
.list()
16621663
.iterator();
@@ -2519,7 +2520,9 @@ public void testPersistCollections() throws Exception {
25192520
).list();
25202521
assertTrue( "collection.elements find", list.size()==2 );
25212522
}
2522-
if (!(getDialect() instanceof SAPDBDialect) ) { // SAPDB doesn't like distinct with binary type
2523+
// SAPDB doesn't like distinct with binary type
2524+
// Oracle12cDialect stores binary types as blobs and do no support distinct on blobs
2525+
if ( !(getDialect() instanceof SAPDBDialect) && !(getDialect() instanceof Oracle12cDialect) ) {
25232526
List list = s.createQuery( "select distinct foo from Baz baz join baz.fooArray foo" ).list();
25242527
assertTrue( "collection.elements find", list.size()==2 );
25252528
}

0 commit comments

Comments
 (0)