Критерии гибернации для различия между двумя столбцами - PullRequest
3 голосов
/ 05 марта 2012

У меня есть тривиальный спящий объект с 2 полями - a и b:

@Entity
public class PlayerEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(nullable = false)
    private Integer a;

    @Column(nullable = false)
    private Integer b;
}


Мне нужно выбрать всех игроков, где a - b > 5.
Можно ли это когда-нибудь сделать, используя стандартный Hibernate Criteria API? Можно ли как-то избежать использования SQL / HQL для этого довольно типичного условия?
Спасибо!

1 Ответ

8 голосов
/ 05 марта 2012

Вы можете использовать Restrictions.sqlRestriction () , чтобы создать Criterion, используя условие SQL:

List<PlayerEntity> playerList = (List<PlayerEntity>)session.createCriteria(PlayerEntity.class)
.add(Restrictions.sqlRestriction("(a- b) > 5")).list();

, который сгенерирует SQL: select * from PlayerEntity where (a-b) > 5

Если вы не хотите использовать SQL для указания условия в Criteria API, вы можете определить (a - b) как производное свойство, используя @Formula:

@Entity
public class PlayerEntity {

  @Column(nullable = false)
  private Integer a;

  @Column(nullable = false)
  private Integer b;

  @Formula("a - b") 
  private Integer delta
}

List<PlayerEntity> playerList = (List<PlayerEntity>)session.createCriteria(PlayerEntity.class)
.add(Restrictions.gt("delta", 5).list();

Обратите внимание, что значением @Formula является фактическое имя столбца, а не сопоставленные имена свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...