diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQueryIsNull.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQueryIsNull.java
index f0eea2a..794cea2 100644
--- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQueryIsNull.java
+++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/query/TestQueryIsNull.java
@@ -25,12 +25,15 @@
 import jakarta.persistence.criteria.ParameterExpression;
 import jakarta.persistence.criteria.Root;
 
+import org.eclipse.persistence.internal.databaseaccess.Platform;
+import org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl;
 import org.eclipse.persistence.jpa.test.framework.DDLGen;
 import org.eclipse.persistence.jpa.test.framework.Emf;
 import org.eclipse.persistence.jpa.test.framework.EmfRunner;
 import org.eclipse.persistence.jpa.test.framework.Property;
 import org.eclipse.persistence.jpa.test.query.model.EntityTbl01;
 import org.eclipse.persistence.jpa.test.query.model.EntityTbl01_;
+import org.eclipse.persistence.platform.database.DatabasePlatform;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -97,6 +100,67 @@
     }
 
     @Test
+    public void testQueryIsNullLiterals2() {
+        if (emf == null)
+            return;
+
+        if(!POPULATED) 
+            populate();
+
+        Platform platform = getPlatform(emf);
+        EntityManager em = emf.createEntityManager();
+
+        // DB2 on z and Derby does not support null literal values in 'IS NULL' function
+        // ie. "... WHERE (NULL IS NULL)"
+        if(platform.isDB2Z() || platform.isDerby()) {
+            return;
+        }
+
+        try {
+            TypedQuery<String> query = em.createQuery(""
+                    + "SELECT t.itemString1 FROM EntityTbl01 t "
+                        + "WHERE NULL IS NULL", String.class);
+
+            List<String> dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(4, dto01.size());
+
+            // equivalent CriteriaBuilder
+            CriteriaBuilder cb = em.getCriteriaBuilder();
+            CriteriaQuery<String> cquery = cb.createQuery(String.class);
+            Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
+            cquery.multiselect(root.get(EntityTbl01_.itemString1));
+
+            cquery.where(cb.isNull(cb.nullLiteral(String.class)));
+
+            query = em.createQuery(cquery);
+            dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(4, dto01.size());
+
+            // equivalent, alternative CriteriaBuilder
+            CriteriaBuilder cb2 = em.getCriteriaBuilder();
+            CriteriaQuery<String> cquery2 = cb2.createQuery(String.class);
+            Root<EntityTbl01> root2 = cquery2.from(EntityTbl01.class);
+            cquery2.multiselect(root2.get(EntityTbl01_.itemString1));
+
+            cquery2.where(cb2.nullLiteral(String.class).isNull());
+
+            query = em.createQuery(cquery2);
+            dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(4, dto01.size());
+        } finally {
+            if (em.getTransaction().isActive()) {
+                em.getTransaction().rollback();
+            }
+            if(em.isOpen()) {
+                em.close();
+            }
+        }
+    }
+
+    @Test
     public void testQueryIsNotNullLiterals1() {
         if (emf == null)
             return;
@@ -151,6 +215,67 @@
     }
 
     @Test
+    public void testQueryIsNotNullLiterals2() {
+        if (emf == null)
+            return;
+
+        if(!POPULATED) 
+            populate();
+
+        Platform platform = getPlatform(emf);
+        EntityManager em = emf.createEntityManager();
+
+        // DB2 on z and Derby does not support null literal values in 'IS NOT NULL' function
+        // ie. "... WHERE (NULL IS NOT NULL)"
+        if(platform.isDB2Z() || platform.isDerby()) {
+            return;
+        }
+
+        try {
+            TypedQuery<String> query = em.createQuery(""
+                    + "SELECT t.itemString1 FROM EntityTbl01 t "
+                        + "WHERE NULL IS NOT NULL", String.class);
+
+            List<String> dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(0, dto01.size());
+
+            // equivalent CriteriaBuilder
+            CriteriaBuilder cb = em.getCriteriaBuilder();
+            CriteriaQuery<String> cquery = cb.createQuery(String.class);
+            Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
+            cquery.multiselect(root.get(EntityTbl01_.itemString1));
+
+            cquery.where(cb.isNotNull(cb.nullLiteral(String.class)));
+
+            query = em.createQuery(cquery);
+            dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(0, dto01.size());
+
+            // equivalent, alternative CriteriaBuilder
+            CriteriaBuilder cb2 = em.getCriteriaBuilder();
+            CriteriaQuery<String> cquery2 = cb2.createQuery(String.class);
+            Root<EntityTbl01> root2 = cquery2.from(EntityTbl01.class);
+            cquery2.multiselect(root2.get(EntityTbl01_.itemString1));
+
+            cquery2.where(cb2.nullLiteral(String.class).isNotNull());
+
+            query = em.createQuery(cquery2);
+            dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(0, dto01.size());
+        } finally {
+            if (em.getTransaction().isActive()) {
+                em.getTransaction().rollback();
+            }
+            if(em.isOpen()) {
+                em.close();
+            }
+        }
+    }
+
+    @Test
     public void testQueryIsNullParameters1() {
         if (emf == null)
             return;
@@ -164,6 +289,72 @@
             TypedQuery<String> query = em.createQuery(""
                     + "SELECT t.itemString1 FROM EntityTbl01 t "
                         + "WHERE ?1 IS NULL", String.class);
+            query.setParameter(1, "HELLO");
+
+            List<String> dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(0, dto01.size());
+
+            // equivalent CriteriaBuilder
+            CriteriaBuilder cb = em.getCriteriaBuilder();
+            CriteriaQuery<String> cquery = cb.createQuery(String.class);
+            Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
+            cquery.multiselect(root.get(EntityTbl01_.itemString1));
+
+            ParameterExpression<String> strParam1 = cb.parameter(String.class);
+            cquery.where(cb.isNull(strParam1));
+
+            query = em.createQuery(cquery);
+            query.setParameter(strParam1, "HELLO");
+            dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(0, dto01.size());
+
+            // equivalent, alternative CriteriaBuilder
+            CriteriaBuilder cb2 = em.getCriteriaBuilder();
+            CriteriaQuery<String> cquery2 = cb2.createQuery(String.class);
+            Root<EntityTbl01> root2 = cquery2.from(EntityTbl01.class);
+            cquery2.multiselect(root2.get(EntityTbl01_.itemString1));
+
+            ParameterExpression<String> strParam2 = cb.parameter(String.class);
+            cquery2.where(strParam2.isNull());
+
+            query = em.createQuery(cquery2);
+            query.setParameter(strParam2, "HELLO");
+            dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(0, dto01.size());
+        } finally {
+            if (em.getTransaction().isActive()) {
+                em.getTransaction().rollback();
+            }
+            if(em.isOpen()) {
+                em.close();
+            }
+        }
+    }
+
+    @Test
+    public void testQueryIsNullParameters2() {
+        if (emf == null)
+            return;
+
+        if(!POPULATED) 
+            populate();
+
+        Platform platform = getPlatform(emf);
+        EntityManager em = emf.createEntityManager();
+
+        // DB2 on z and Derby does not support null literal values in 'IS NULL' function
+        // ie. "... WHERE (NULL IS NULL)"
+        if(platform.isDB2Z() || platform.isDerby()) {
+            return;
+        }
+
+        try {
+            TypedQuery<String> query = em.createQuery(""
+                    + "SELECT t.itemString1 FROM EntityTbl01 t "
+                        + "WHERE ?1 IS NULL", String.class);
             query.setParameter(1, null);
 
             List<String> dto01 = query.getResultList();
@@ -223,6 +414,72 @@
             TypedQuery<String> query = em.createQuery(""
                     + "SELECT t.itemString1 FROM EntityTbl01 t "
                         + "WHERE ?1 IS NOT NULL", String.class);
+            query.setParameter(1, "HELLO");
+
+            List<String> dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(4, dto01.size());
+
+            // equivalent CriteriaBuilder
+            CriteriaBuilder cb = em.getCriteriaBuilder();
+            CriteriaQuery<String> cquery = cb.createQuery(String.class);
+            Root<EntityTbl01> root = cquery.from(EntityTbl01.class);
+            cquery.multiselect(root.get(EntityTbl01_.itemString1));
+
+            ParameterExpression<String> strParam1 = cb.parameter(String.class);
+            cquery.where(cb.isNotNull(strParam1));
+
+            query = em.createQuery(cquery);
+            query.setParameter(strParam1, "HELLO");
+            dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(4, dto01.size());
+
+            // equivalent, alternative CriteriaBuilder
+            CriteriaBuilder cb2 = em.getCriteriaBuilder();
+            CriteriaQuery<String> cquery2 = cb2.createQuery(String.class);
+            Root<EntityTbl01> root2 = cquery2.from(EntityTbl01.class);
+            cquery2.multiselect(root2.get(EntityTbl01_.itemString1));
+
+            ParameterExpression<String> strParam2 = cb.parameter(String.class);
+            cquery2.where(strParam2.isNotNull());
+
+            query = em.createQuery(cquery2);
+            query.setParameter(strParam2, "HELLO");
+            dto01 = query.getResultList();
+            assertNotNull(dto01);
+            assertEquals(4, dto01.size());
+        } finally {
+            if (em.getTransaction().isActive()) {
+                em.getTransaction().rollback();
+            }
+            if(em.isOpen()) {
+                em.close();
+            }
+        }
+    }
+
+    @Test
+    public void testQueryIsNotNullParameters2() {
+        if (emf == null)
+            return;
+
+        if(!POPULATED) 
+            populate();
+
+        Platform platform = getPlatform(emf);
+        EntityManager em = emf.createEntityManager();
+
+        // DB2 on z and Derby does not support null literal values in 'IS NOT NULL' function
+        // ie. "... WHERE (NULL IS NOT NULL)"
+        if(platform.isDB2Z() || platform.isDerby()) {
+            return;
+        }
+
+        try {
+            TypedQuery<String> query = em.createQuery(""
+                    + "SELECT t.itemString1 FROM EntityTbl01 t "
+                        + "WHERE ?1 IS NOT NULL", String.class);
             query.setParameter(1, null);
 
             List<String> dto01 = query.getResultList();
@@ -318,4 +575,8 @@
             }
         }
     }
+
+    private DatabasePlatform getPlatform(EntityManagerFactory emf) {
+        return ((EntityManagerFactoryImpl)emf).getServerSession().getPlatform();
+    }
 }
\ No newline at end of file
