Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JPA @OrderBy with Hibernate

Im using hibernate and want to use @OrderBy to order a resultSet:

public class TopLevelEntity extends Entity {
    @OneToMany(mappedBy = "topLevelEntity", fetch = FetchType.LAZY, 
               cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<TopLevelEntityTranslation> translations;
    //other fields
}

public class NextLevelEntity extends Entity {
    @OneToMany(mappedBy = "nextLevelEntity", fetch = FetchType.LAZY, 
               cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<NextLevelEntityTranslation> translations;

    @Column
    private Long number;
    //other fields
}

public class TopLevelEntityTranslation extends Entity {
    @ManyToOne
    @JoinColumn(name = "TOP_LVL_ENTITY_ID")
    private TopLevelEntity topLevelEntity;
    
    @OrderBy("nextLevelEntity.number")
    @OneToMany(mappedBy = "topLevelEntityTranslation", fetch = FetchType.LAZY, 
               cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<NextLevelEntityTranslation> nextLevelEntityTranslations;
    //other fields
}

public class NextLevelEntityTranslation extends Entity {
    @ManyToOne
    @JoinColumn(name = "TOP_LVL_ENTITY_TR_ID")
    private TopLevelEntityTranslation topLevelEntityTranslation;

    @ManyToOne
    @JoinColumn(name = "NEXT_LVL_ENTITY_ID")
    private NextLevelEntity nextLevelEntity;
    //other fields
}

I have an entity hierarchy like shown above. But @OrderBy annotation(no the annotation ofc, but the statement generated by hibernate) throws an exception. Exception main part:

missing FROM-clause entry for table "nextLevelEntity"

There are few examples of using jpa @OrderBy but pattern of those that I found is the same with mine. Read that @OrderBy doesn't work well with Hibernate's JPA implementation. But the question was asked 7 years ago. Is it true or i have a mistake in my code?

like image 887
myangrysoul Avatar asked Nov 04 '25 03:11

myangrysoul


1 Answers

Actually, according to the documentation for the @OrderBy:

The dot (".") notation is used to refer to an attribute within an embedded attribute. The value of each identifier used with the dot notation is the name of the respective embedded field or property.

Example:

@Entity 
public class Person {
   ...
   @ElementCollection
   @OrderBy("zipcode.zip, zipcode.plusFour")
   public Set<Address> getResidences() {...};
   ...
}
  
@Embeddable 
public class Address {
  protected String street;
  protected String city;
  protected String state;

  @Embedded
  protected Zipcode zipcode;
}

@Embeddable 
public class Zipcode {
   protected String zip;
   protected String plusFour;
}

So, you can not use it for your case.

like image 79
SternK Avatar answered Nov 06 '25 18:11

SternK