是否可以在 QueryDSL 查询中使用枚举方法
Is it possible to use a Enum-Method in a QueryDSL query
我有一个包含枚举字段的实体类型。
我使用 JPA 2.1 AttributeConverter 将枚举 instances/values 映射到数据库列。
枚举值包含我想在 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);
}
}
查询应仅 return 消息类型为 global==true
的消息。但是生成的 QMessage
class 不提供该功能。 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");
}
}
一种可能的 solution/workaround 是在枚举类型中创建一个静态方法,returns 匹配枚举值的集合 (global==true
):
return new JPAQuery(em)
.from(message)
.where(message.messageType.in(MessageType.getGlobalMessageTypes())
.list(message);
枚举在 JPA 中被视为 value/literal 类型,因此没有干净的方法通过 property/method 引用来处理它。
我有一个包含枚举字段的实体类型。 我使用 JPA 2.1 AttributeConverter 将枚举 instances/values 映射到数据库列。 枚举值包含我想在 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);
}
}
查询应仅 return 消息类型为 global==true
的消息。但是生成的 QMessage
class 不提供该功能。 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");
}
}
一种可能的 solution/workaround 是在枚举类型中创建一个静态方法,returns 匹配枚举值的集合 (global==true
):
return new JPAQuery(em)
.from(message)
.where(message.messageType.in(MessageType.getGlobalMessageTypes())
.list(message);
枚举在 JPA 中被视为 value/literal 类型,因此没有干净的方法通过 property/method 引用来处理它。