Счетчик JpaRepository не работает должным образом - PullRequest
0 голосов
/ 22 апреля 2020

По какой-то странной причине сгенерированные Jpa запросы не генерируются, как ожидалось. Используя jpa, я написал следующий запрос в моем репозитории:

Мой объект

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  var id: Long = _

  @Column(name = "global_event_id", nullable = false)
  var globalEventId: Long = _

  @Column(name = "date_created")
  @NotNull
  @Type(`type` = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
  var dateCreated: DateTime = _

  @Column(name = "ip", nullable = false)
  var ip: String = _

  @Column(name = "email")
  var email: java.lang.String = _

Мой репозиторий

trait RequestRepository extends JpaRepository[Request, java.lang.Long] {    
def countDistinctIpByGlobalEventIdGreaterThanAndDateCreatedGreaterThanAndEmail(@Param("globalEventId") globalEventId: Long, @Param("dateCreated") dateCreated: DateTime, @Param("email") email: String): java.lang.Long
}

Я ожидаю, что будет сгенерирован следующий запрос

SELECT count(distinct(ip)) FROM rule_request WHERE global_event_id > ? AND email = ? AND date_created >= ?

но вместо этого генерируется следующее, что явно неверно ( id вместо ip для начинающих)

select distinct count(request0_.id) as col_0_0_ from rule_request request0_ where request0_.global_event_id>? and request0_.date_created>? and request0_.email=?

Я использую:

            <dependency>
                <groupId>org.hibernate.javax.persistence</groupId>
                <artifactId>hibernate-jpa-2.1-api</artifactId>
                <version>1.0.0.Final</version>
            </dependency>

Есть идеи, почему, пожалуйста?

1 Ответ

1 голос
/ 23 апреля 2020

Вы пытаетесь использовать деривацию запросов за пределами своих возможностей.

distinct используется исключительно для получения различных результатов.

count всегда эффективно подсчитывает все строки, просто подсчитывая идентификаторы .

Невозможно сделать запрос для создания count( distinct <expression>) или даже count( <expression>).

. Вместо этого используйте аннотацию @Query.

...