2013-08-10 1 views
0

데이터베이스에 가격을 저장해야합니다. 나는 JPA를 사용하고, 그래서 나는이 같은 모델을 가지고 :JPA와 Oracle을 사용하여 데이터베이스에 후미 0을 저장합니다.

@Entity 
@Table(name="products") 
public class Product { 

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

    @Column(name="price") 
    private float price; 
} 

문제는 내가 좋아하는 값으로 가격 양식 입력을 채울 때 "4.20", 내 Oracle 데이터베이스에 나는 "4.2"얻을 것입니다, 후행하는 0을 잃는다.

이 문제를 어떻게 해결할 수 있습니까?

EDIT : JPA를 사용하고 있으므로 원래 Oracle Dialect에서 쿼리를 작성하지 않아야합니다. 제품을 가격과 함께 저장하려면 간단하게 em.persist(product)과 같은 것을 작성하십시오. 여기서 Entity는 EntityManager입니다.

+0

당신은 가격을 저장할 - 즉 일반적으로 좋은 생각이 아니다. 내가 정수로 전환하는 것이 좋습니다 (어쩌면 암시 적) 통화 + 통화 지수를 사용합니다. 4.20 -> 420 (USD, 2) – esej

답변

6

해결할 수 없으므로 문제가되지 않습니다. 오라클이 NUMBER 값을 저장하는 방법은 정확도가 가장 떨어지는 것입니다. 4.00으로 가격을 입력하면 4으로 저장됩니다.

Java는 값을 표시 할 때 기본값으로 두 개의 소수점 이하 자릿수가 사용되지 않습니다. 소수 자릿수를 지정해야합니다.

그리고 가능한 경우 float 대신 BigDecimal을 사용하고 싶습니다. float 유형이 정확하지 않습니다. 다른 방법으로는 정수 유형 (int 또는 long) 중 하나를 사용하고 직접 소수점을 관리하는 것입니다.

Java 코드에 표시 할 가격을 지정하려면 String.format("%.2f", price)을 사용하십시오.

는 오라클 쿼리의 가격을 포맷하려면, TO_CHAR를 사용
SELECT TO_CHAR(price, '999999990.00'), etc. 

당신을 위해 가장 좋은 자리의 수를 선택하고, 오라클은 결과의 시작 부분에 여분의 공간을 넣어 않습니다. 숫자가 음수이면 음수 기호를 누르고, 음수이면 음수를 나타냅니다. 공간을 제거하는 것은 TO_CHARFM 수정을 사용 : 플로트/더블로

SELECT TO_CHAR(price, 'FM999999990.00'), etc. 
+0

자, BigDecimal을 사용해 보겠습니다. 그러나 나는 String.format ("% .2f", price)'을 어디에서 써야하는지 이해하지 못했다. 또 다른 문제는 JPA를 사용하고 있기 때문에 원시 Oracle Dialect에서 쿼리를 작성하지 않는 것입니다. 가격을 가지고 상품을 저장하기 위해서 나는'em.persist (product)'와 같은 것을 쓴다. 여기서'em'은 EntityManager이다. –

+0

+1하지만 오라클 스토리지 포맷이 아니라 출력 표현에 관한 것입니다. – ThinkJet

+0

Kurt - JPA에 익숙하지 않습니다. (주로 .NET MVC를 사용합니다.) 인터넷 검색을 통해 '가격'값으로 사용할 수있는이 주석을 함께 작성했습니다. 1 행 :'@Column (name = "price", precision = 12, scale = 2)'. 2 행 :'private BigDecimal price;'. 내가 원한다면 제대로 작동한다면'String.format'을 할 필요가 없을 것입니다. 내가 아는 바로는 주석은 '유동 (float)'에서도 작동 할 수 있습니다. 희망이 도움이 :) –

관련 문제