From 847ce5db884955e9f7271cddfb71b4aca1edce34 Mon Sep 17 00:00:00 2001 From: Ryszard Trojnacki Date: Tue, 31 Aug 2021 11:34:35 +0200 Subject: [PATCH] Added PByteArray query bean type for byte[] column type. --- .../java/io/ebean/typequery/PByteArray.java | 27 +++++++ .../java/org/example/domain/Customer.java | 12 +++ .../org/querytest/QCustomerByteArrayTest.java | 77 +++++++++++++++++++ .../querybean/generator/PropertyTypeMap.java | 1 + .../querybean/generator/PropertyTypeMap.java | 1 + 5 files changed, 118 insertions(+) create mode 100644 ebean-querybean/src/main/java/io/ebean/typequery/PByteArray.java create mode 100644 ebean-querybean/src/test/java/org/querytest/QCustomerByteArrayTest.java diff --git a/ebean-querybean/src/main/java/io/ebean/typequery/PByteArray.java b/ebean-querybean/src/main/java/io/ebean/typequery/PByteArray.java new file mode 100644 index 000000000..222215887 --- /dev/null +++ b/ebean-querybean/src/main/java/io/ebean/typequery/PByteArray.java @@ -0,0 +1,27 @@ +package io.ebean.typequery; + +/** + * Byte array property (byte[]). + * + * @param the root query bean type + */ +public class PByteArray extends PBaseValueEqual { + /** + * Construct with a property name and root instance. + * + * @param name property name + * @param root the root query bean instance + */ + public PByteArray(String name, R root) { + super(name, root); + } + + /** + * Construct with additional path prefix. + */ + public PByteArray(String name, R root, String prefix) { + super(name, root, prefix); + } + + +} diff --git a/ebean-querybean/src/test/java/org/example/domain/Customer.java b/ebean-querybean/src/test/java/org/example/domain/Customer.java index 36d3fa840..453b71818 100644 --- a/ebean-querybean/src/test/java/org/example/domain/Customer.java +++ b/ebean-querybean/src/test/java/org/example/domain/Customer.java @@ -13,6 +13,7 @@ import javax.persistence.Entity; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; +import javax.persistence.Lob; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -68,6 +69,9 @@ public class Customer extends BaseModel { @OneToMany(mappedBy = "customer", cascade = CascadeType.PERSIST) List contacts; + @Column @Lob + byte[] photo; + public Status getStatus() { return status; } @@ -156,6 +160,14 @@ public class Customer extends BaseModel { this.email = email; } + public byte[] getPhoto() { + return photo; + } + + public void setPhoto(byte[] photo) { + this.photo = photo; + } + /** * Helper method to add a contact to the customer. */ diff --git a/ebean-querybean/src/test/java/org/querytest/QCustomerByteArrayTest.java b/ebean-querybean/src/test/java/org/querytest/QCustomerByteArrayTest.java new file mode 100644 index 000000000..3496172a1 --- /dev/null +++ b/ebean-querybean/src/test/java/org/querytest/QCustomerByteArrayTest.java @@ -0,0 +1,77 @@ +package org.querytest; + +import io.ebean.DB; +import io.ebean.Database; +import org.example.domain.Customer; +import org.example.domain.query.QCustomer; +import org.junit.Test; +import org.junit.Assert; + +import java.util.List; + +public class QCustomerByteArrayTest { + @Test + public void testIsNull() { + final byte[] photo1= new byte[] { 0x05, 0x10, 0x20, 0x30 }; + final byte[] photo2=new byte[] { 0x50, 0x55, 0x60, 0x70, 0x10 }; + final Database db=DB.getDefault(); + final String noPhoto="no_photo_client"; + final String wPhoto1="with_photo1_client"; + final String wPhoto2="with_photo2_client"; + + Customer c; + + c=new Customer(); + c.setName(noPhoto); + c.save(); + + c=new Customer(); + c.setName(wPhoto1); + c.setPhoto(photo1); + c.save(); + + c=new Customer(); + c.setName(wPhoto2); + c.setPhoto(photo2); + c.save(); + + Assert.assertNotNull(new QCustomer(db).name.eq(noPhoto).photo.isNull().findOne()); + // Assert.assertNotNull(new QCustomer(db).name.eq(noPhoto).photo.ne(photo1).findOne()); // Fails + Assert.assertNull(new QCustomer(db).name.eq(noPhoto).photo.isNotNull().findOne()); + Assert.assertNull(new QCustomer(db).name.eq(noPhoto).photo.eq(photo1).findOne()); + + + Assert.assertNotNull(new QCustomer(db).name.eq(wPhoto1).photo.isNotNull().findOne()); + Assert.assertNotNull(new QCustomer(db).name.eq(wPhoto1).photo.eq(photo1).findOne()); + Assert.assertNotNull(new QCustomer(db).photo.eq(photo1).findOne()); + Assert.assertNotNull(new QCustomer(db).name.eq(wPhoto1).photo.ne(photo2).findOne()); + + Assert.assertNull(new QCustomer(db).name.eq(wPhoto1).photo.isNull().findOne()); + Assert.assertNull(new QCustomer(db).name.eq(wPhoto1).photo.eq(photo2).findOne()); + Assert.assertNull(new QCustomer(db).name.eq(wPhoto1).photo.ne(photo1).findOne()); + + Assert.assertNotNull(new QCustomer(db).name.eq(wPhoto2).photo.isNotNull().findOne()); + Assert.assertNotNull(new QCustomer(db).name.eq(wPhoto2).photo.eq(photo2).findOne()); + Assert.assertNotNull(new QCustomer(db).photo.eq(photo2).findOne()); + Assert.assertNotNull(new QCustomer(db).name.eq(wPhoto2).photo.ne(photo1).findOne()); + + Assert.assertNull(new QCustomer(db).name.eq(wPhoto2).photo.isNull().findOne()); + Assert.assertNull(new QCustomer(db).name.eq(wPhoto2).photo.eq(photo1).findOne()); + Assert.assertNull(new QCustomer(db).name.eq(wPhoto2).photo.ne(photo2).findOne()); + + Assert.assertEquals(2, new QCustomer(db).photo.in(photo1, photo2).findList().size()); + + + List ordered = new QCustomer(db).name.in(wPhoto1, wPhoto2).photo.desc().findList(); + Assert.assertEquals(wPhoto2, ordered.get(0).getName()); + Assert.assertArrayEquals(photo2, ordered.get(0).getPhoto()); + Assert.assertEquals(wPhoto1, ordered.get(1).getName()); + Assert.assertArrayEquals(photo1, ordered.get(1).getPhoto()); + + ordered = new QCustomer(db).name.in(wPhoto1, wPhoto2).photo.asc().findList(); + Assert.assertEquals(wPhoto2, ordered.get(1).getName()); + Assert.assertArrayEquals(photo2, ordered.get(1).getPhoto()); + Assert.assertEquals(wPhoto1, ordered.get(0).getName()); + Assert.assertArrayEquals(photo1, ordered.get(0).getPhoto()); + } +} diff --git a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java index 6afc8a6e3..28e78afa7 100644 --- a/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java +++ b/kotlin-querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java @@ -55,6 +55,7 @@ class PropertyTypeMap { map.put("java.lang.Class", new PropertyType("PClass")); addType(Locale.class); addType(File.class); + map.put("byte[]", new PropertyType("PByteArray")); addType(InetAddress.class); map.put(URI.class.getName(), new PropertyType("PUri")); map.put(URL.class.getName(), new PropertyType("PUrl")); diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java index fa35c72fa..848f37791 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java @@ -55,6 +55,7 @@ class PropertyTypeMap { addType(Locale.class); map.put("java.lang.Class", new PropertyType("PClass")); addType(File.class); + map.put("byte[]", new PropertyType("PByteArray")); addType(InetAddress.class); map.put(URI.class.getName(), new PropertyType("PUri")); map.put(URL.class.getName(), new PropertyType("PUrl"));