【问题标题】:Is it possible to use a Enum-Method in a QueryDSL query是否可以在 QueryDSL 查询中使用枚举方法
【发布时间】:2015-09-08 12:28:20
【问题描述】:

我有一个包含枚举字段的实体类型。 我使用 JPA 2.1 AttributeConverter 将枚举实例/值映射到数据库列。 Enum 值包含我想在 QueryDSL 查询中使用的附加信息,就好像该信息将存储在数据库中一样。

示例: 包含 messageType 的消息实体。类型是枚举值。枚举确定消息是否是全局的。在数据库中,枚举表示为一个 int 值。是否全局的信息是枚举的一部分。

这样写可以吗?

import static com.example.QMessage.message;

@Repository
public class MessageDao {

    @PersistenceContext
    protected EntityManager em;

    public List<Message> getGlobalMessages() {
        return new JPAQuery(em)
            .from(message)
            .where(message.messageType.global.isTrue())
            .list(message);
    }
}

查询应该只返回消息类型为global==true 的消息。但是生成的QMessageclass 不提供该功能。 message.messageType给出EnumPath,但无法调用枚举的函数。

枚举

public enum MessageType {
    WELCOME(0, true),
    REMINDER(1),
    IMPORTANT(0, true);

    private final int id;
    private final boolean global;

    private MessageType(int id) {
        this(id, false);
    }

    private MessageType(int id, boolean global) {
        this.id = id;
        this.global = global;
    }

    public int getId() {
        return this.id;
    }

    public boolean isGlobal() {
        return this.global;
    }
}

实体

@Entity
public class Message {

    @Id
    private long messageId;

    @Column(name = "MESSAGE")
    private String message;

    @Column(name = "MESSAGE_TYPE")
    private MessageType messageType;

    // Getter and Setter
    // ... 
}

转换器

@Converter(autoApply = true)
public class MessageTypeConverter implements AttributeConverter<Integer, String> {

    @Override
    public Integer convertToDatabaseColumn(MessageType messageType) {
        return messageType.getId();
    }

    @Override
    public Locale convertToEntityAttribute(Integer dbValue) {
        for(MessageType type : values()) {
            if(type.getId() == dbValue) {
                return type;
            }
        }
        throw new IllegalArgumentException("Unknown id");
    }
}

【问题讨论】:

    标签: java jpa enums querydsl


    【解决方案1】:

    一种可能的解决方案/解决方法是在枚举类型中创建一个静态方法,该方法返回匹配枚举值的集合 (global==true):

    return new JPAQuery(em)
            .from(message)
            .where(message.messageType.in(MessageType.getGlobalMessageTypes())
            .list(message);
    

    【讨论】:

      【解决方案2】:

      枚举在 JPA 中被视为值/文字类型,因此无法通过属性/方法引用来处理它。

      【讨论】:

        猜你喜欢
        • 2016-08-31
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 1970-01-01
        • 2014-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多