PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Hibernate @Filter collection of enums

Nói chung, bạn không phải "truyền" giá trị, trên thực tế, bạn chỉ cần chuyển các giá trị ở dạng chúng được lưu trữ.

Nếu chúng tôi cho rằng trường của bạn chỉ được chú thích là @Enumerated(EnumType.STRING) cột sẽ là một trường varchar thuần túy. (Ánh xạ một kiểu java thành một enum postgres là một chủ đề lớn khác.)

Nếu bây giờ bạn muốn so sánh danh sách Status của mình Các trường hợp enum với các giá trị chuỗi liên quan trong db, hãy chuyển nó dưới dạng tập hợp các chuỗi, nói cách khác, gọi nó là toString() nếu đó là java enum .

Ví dụ. đây là enum của bạn:

public enum EntityStatus {
    A, B, C;
}

Đây là Pháp nhân của bạn:

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;

@Entity
@FilterDef(name = "byMultipleStates", defaultCondition = "status in (:states)", parameters = @ParamDef(name = "states", type = "string"))
@Filter(name = "byMultipleStates", condition = "status in (:states)")
public class StatusEntity {

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

    @Enumerated(EnumType.STRING)
    private EntityStatus status;

    public long getId() {
        return id;
    }

    public EntityStatus getStatus() {
        return status;
    }

    public void setStatus(EntityStatus status) {
        this.status = status;
    }

}

Đây có thể là mã của bạn để lọc:

public List<StatusEntity> filterByStates(final Set<EntityStatus> states) {
    final Session hibernateSession = entityManager.unwrap(Session.class);
    hibernateSession.enableFilter("byMultipleStates").setParameterList("states",
            states.stream().map(state -> state.toString()).collect(Collectors.toList()));
    final Query query = hibernateSession.createQuery("SELECT e FROM StatusEntity e");

    return query.list();
}

Hoặc theo cách trước Java 8:

public List<StatusEntity> filterByStates(final Set<EntityStatus> states) {
    final Set<String> statesAsString = new HashSet<>();
    for (final EntityStatus state : states) {
        statesAsString.add(state.toString());
    }

    final Session hibernateSession = entityManager.unwrap(Session.class);
    hibernateSession.enableFilter("byMultipleStates").setParameterList("states", statesAsString);
    final Query query = hibernateSession.createQuery("SELECT e FROM StatusEntity e");

    return query.list();
}

Vì vậy, chỉ cần lọc một tập hợp các giá trị là có thể.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để đặt tham số String [] cho một truy vấn gốc?

  2. Cập nhật nhiều hàng trong cùng một truy vấn bằng PostgreSQL

  3. Sử dụng COALESCE để xử lý các giá trị NULL trong PostgreSQL

  4. Làm thế nào để kết xuất một đối tượng trong chế độ xem Django?

  5. Lấy thông tin từ một máy chủ Rails này đến một máy chủ Rails khác