Есть ли такая вещь выражение CASE в JPQL?

Это не обязательно важно; это зависит от размера ваших коллекций и требований к производительности, и будет ли ваш класс использоваться в библиотеке, где вы не можете знать требования к производительности. Я часто знаю, что размеры моей коллекции не очень большие, и мое время более ценно, чем несколько микросекунд производительности, достигнутых благодаря созданию идеального хеш-кода; поэтому (чтобы избавиться от раздражающего предупреждения компилятором) я просто использую:

   public override int GetHashCode()
   {
      return base.GetHashCode();
   }

(Конечно, я мог бы использовать #pragma, чтобы выключить предупреждение, но я предпочитаю этот способ.)

Если вы находитесь в том положении, в котором вы делаете , то, конечно, требования к производительности, чем все проблемы, упомянутые другими, применяются здесь. Самое главное - иначе вы получите неправильные результаты при извлечении элементов из хеш-набора или словаря: хеш-код не должен меняться в зависимости от времени жизни объекта (точнее, в течение времени, когда требуется хэш-код, например, ключ в словаре): например, следующее неверно, поскольку значение является общедоступным и поэтому может быть изменено извне в класс во время жизни экземпляра, поэтому вы не должны использовать его в качестве основы для хеш-кода:


   class A
   {
      public int Value;

      public override int GetHashCode()
      {
         return Value.GetHashCode(); //WRONG! Value is not constant during the instance's life time
      }
   }    

С другой стороны, если значение не может быть изменено, это нормально использовать:


   class A
   {
      public readonly int Value;

      public override int GetHashCode()
      {
         return Value.GetHashCode(); //OK  Value is read-only and can't be changed during the instance's life time
      }
   }

33
задан Adeel Ansari 9 January 2009 в 09:08
поделиться

2 ответа

Можно использовать слушателей события, предоставленных Jpa, чтобы сделать что-то при загрузке одной строки дб, т.е.:

@Entity
@Table(name = "TableA")
public class TableA {

    @Id
    @Column(name = "Field1")
    private Long id;

    @Column(name = "Field2")
    private Long field2;

    @Column(name = "Field3")
    private Long field3;

    // ... more associated getter and setter...

    @Transient
    private String field4;

    @PostLoad
    private void onLoad() {
        if (field2 != null) {
            switch (field2.intValue()) {
            case 1:
                field4 = "One";
                break;
            case 2:
                field4 = "Two";
                break;
            default:
                field4 = "Other Number";
                break;
            }
        }
    }
}

(field4 не сохраняются в дб)

(берут это как обходное решение к "не реализованная опция в JPA" как операторы выбора)

1
ответ дан aledbf 11 October 2019 в 07:51
поделиться

В Hibernate, безусловно, есть такая вещь, поэтому, когда вы используете Hibernate в качестве поставщика JPA, вы можете написать свой запрос, как в этом примере:

    Query query = entityManager.createQuery("UPDATE MNPOperationPrintDocuments o SET o.fileDownloadCount = CASE WHEN o.fileDownloadCount IS NULL THEN 1 ELSE (o.fileDownloadCount + 1) END " +
                                            " WHERE o IN (:operations)");
    query.setParameter("operations", mnpOperationPrintDocumentsList);

    int result = query.executeUpdate();
1
ответ дан 27 November 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: