작성
·
303
0
안녕하십니까 집합 함수 적용에 관해 궁금한 점이 있어서 질문 드립니다.
아래와 같이 AttributeConverter 적용 필드의 경우에는 QueryDSL로 집합함수 적용이 가능한 방법이 있는지 궁금합니다.
public class Product {
public enum ProductStatus { PROCEEDING, SOLD_OUT;}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PRODUCT_ID")
private Long id;
@Column(name = "TITLE")
private String title;
@Column(name = "PRICE")
private Money price;
}
public class Money {
public static final Money ZERO = Money.wons(0);
private final BigDecimal amount;
public static Money wons(long amount) {
return new Money(BigDecimal.valueOf(amount));
}
public static Money wons(double amount) {
return new Money(BigDecimal.valueOf(amount));
}
public static <T> Money sum(Collection<T> bags, Function<T, Money> monetary) {
return bags.stream().map(bag -> monetary.apply(bag)).reduce(Money.ZERO, Money::plus);
}
Money(BigDecimal amount) {
this.amount = amount;
}
public Money plus(Money amount) {
return new Money(this.amount.add(amount.amount));
}
public Money minus(Money amount) {
return new Money(this.amount.subtract(amount.amount));
}
public Money times(double percent) {
return new Money(this.amount.multiply(BigDecimal.valueOf(percent)));
}
public Money divide(double divisor) {
return new Money(amount.divide(BigDecimal.valueOf(divisor)));
}
public boolean isLessThan(Money other) {
return amount.compareTo(other.amount) < 0;
}
public boolean isGreaterThan(Money other) {
return amount.compareTo(other.amount) > 0;
}
public BigDecimal getAmount() {
return amount;
}
public Long longValue() {
return amount.longValue();
}
public Double doubleValue() {
return amount.doubleValue();
}
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (!(object instanceof Money)) {
return false;
}
Money other = (Money)object;
return Objects.equals(amount.doubleValue(), other.amount.doubleValue());
}
public int hashCode() {
return Objects.hashCode(amount);
}
public String toString() {
return amount.toString() + "원";
}
}
@Converter(autoApply = true)
public class MoneyConverter implements AttributeConverter<Money, Long> {
@Override
public Long convertToDatabaseColumn(Money money) {
return money.getAmount().longValue();
}
@Override
public Money convertToEntityAttribute(Long amount) {
return Money.wons(amount);
}
}
답변 1
1
안녕하세요. 엄수림님
컨버터를 사용한 경우 Querydsl 집합 함수를 사용하기는 어렵습니다.
Money를 값 타입으로 사용하시면 그 안에 있는 amount에 Querydsl 집합 함수를 적용할 수 있습니다.
감사합니다.
답변 감사합니다!
추가적으로 궁금한게 있는데 Entity에 보통 컨버터보다는 값 타입을 사용하는 것이 권장되는 방식일까요??
또한, 컨버터를 유지하고 Nativequery를 적용했는데 이 역시 적절한 방법은 아닐까요??? 차라리 MyBatis를 적용하는 방식이 더 적절한 것인지 궁금합니다!