ObjectDB ObjectDB

Object comparation never matches



I'm trying to compare 2 identical objects in SELECT with no success:

public class PhoneNumber implements Serializable {
    int countryCode;
    long number;


Which is a part of Customer object:


        query="SELECT a FROM Customer c WHERE c.principal = :principal"
public abstract class Customer implements Serializable {
    Object principal;

The entity is:

public class MobileCustomer extends Customer {
    @Id @GeneratedValue
    private Long id;
public void setPrincipal(PhoneNumber number){
    principal = number;


And making a query:

Customer customer = em.createNamedQuery("authentication.getByPrincipal", Customer.class)
                .setParameter("principal", authentication.getPrincipal()).getSingleResult();

According to ObjectDB explorer, the record is stored as expected.

... principal | PhoneNumber | {}

        countryCode | int | 123

        number | long | 4567890


Then I'm constructing exactly the same object PhoneNumber and passing it to above search query as "principal" and getting "[ObjectDB 2.4.6] javax.persistence.NoResultException" "No matching results for a unique query (error 782)"  on getSingleResult

PhoneNumber contains exactly 2 fields. So I'm sure that both objects are same.

What am I doing wrong?



In queries you can compare entity objects and compare simple values, but not embedded objects.

Try the following query:

SELECT a FROM Customer c
WHERE c.principal.countryCode = :countryCode
  AND c.principal.number = :number
ObjectDB Support

But what about: http://www.objectdb.com/java/jpa/query/jpql/comparison

Section "Comparable Data Types"

Comparison is supported for values of the following data types:


Instances of user defined classes (entity classes and embeddable classes) can be compared by using the equality operators (=, <>, ==, !=). For entities, e1 = e2 if e1 and e2 have the same type and the same primary key value. For embeddable objects, e1 = e2 if e1 and e2 have exactly the same content.


though it is exactly what I'm trying to do.


You are right. It was supported, even though it was never widely used.

Build 2.4.7_16 includes an attempt to enable this feature again.

However, there are still reasons to prefer value comparison as suggested in #2 above:

  • Value comparison is compatible with JPA and therefore more portable.
  • Value comparison could be more efficient (especially if indexes are defined).
  • Embedded comparison does not support changes to the schema of the embeddable class. After such a change, old objects and new objects will not be considered as equal.
ObjectDB Support

I'll consider your suggestions.

Thanks for quick response! Your product is really impressive!



To post on this website please sign in.