1

I'm facing a strange problem porting a working application from JEE6 (glassfish 3/eclipselink 2.5.1) to JEE7 (glassfish 4/eclipselink 2.5.2).

I've these entities (getter/setter are project Lombok annotations):

@Entity
@Table(name = "languages")
public class Language {
  @Getter
  @Setter
  @NotNull
  @Column(name = "code")
  private String code;

  @Getter
  @Setter
  @ManyToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "translation_id")
  private Translation translations = new Translation();
}

@Entity
@Table(name = "translations")
public class Translation { 
  @ElementCollection
  @MapKeyColumn(name="locale")
  @Column(name="description")
  @CollectionTable(name="translations_values")
  private Map<String, String> strings = new HashMap<>();

  public Translation() {
  }

  public Translation(Map<String, String> map) {
    this.strings = map;
  }

  public void setString(String locale, String text) {
    strings.put(locale, text);
  }

  public String getString(String locale) {
    String returnValue = strings.get(locale);
    return (returnValue != null ? returnValue : null);
  }
}

If I run this JPQL query, it works:

select o from Language o join o.translations t join t.strings s where key(s) = 'it' and value(s) = 'Italiano'

If I run the same query adding an order by clause on elementcollection, it doesn't work:

select o from Language o join o.translations t join t.strings s where key(s) = 'it' and value(s) = 'Italiano' order by value(s)

The result is:

Local Exception Stack: 
Exception [EclipseLink-6168] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.QueryException
Exception Description: Query failed to prepare, unexpected error occurred: [java.lang.NullPointerException].
Internal Exception: java.lang.NullPointerException
Query: ReadAllQuery(referenceClass=Language jpql="select o from Language o join o.translations t join t.strings s where key(s) = 'it' and value(s) = 'Italiano' order by value(s)")
    at org.eclipse.persistence.exceptions.QueryException.prepareFailed(QueryException.java:1589)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:680)
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.checkPrepare(ObjectLevelReadQuery.java:901)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:613)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:194)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1603)
Caused by: java.lang.NullPointerException
    at org.eclipse.persistence.mappings.ForeignReferenceMapping.getOrderByNormalizedExpressions(ForeignReferenceMapping.java:2456)
    at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalizeOrderBy(SQLSelectStatement.java:1614)
    at org.eclipse.persistence.internal.expressions.SQLSelectStatement.normalize(SQLSelectStatement.java:1403)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.buildNormalSelectStatement(ExpressionQueryMechanism.java:549)
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.prepareSelectAllRows(ExpressionQueryMechanism.java:1720)
    at org.eclipse.persistence.queries.ReadAllQuery.prepareSelectAllRows(ReadAllQuery.java:813)
    at org.eclipse.persistence.queries.ReadAllQuery.prepare(ReadAllQuery.java:744)
    at org.eclipse.persistence.queries.DatabaseQuery.checkPrepare(DatabaseQuery.java:661)
    ... 9 more

My application on glassfish 3 / eclipselink 2.5.1 works fine on the JPQL query above.

Is there any workaround ?

Many thanks in advance

giates
  • 301
  • 4
  • 15
  • I've found a workaround, I've converted the ElementCollection annotation into a OneToMany list of new TranslationValue elements (translation_id, locale and description fields), now I can ordering data avoiding the use of KEY() / VALUE() function... – giates Aug 28 '14 at 15:21

0 Answers0