iT邦幫忙

0

hibernate .addentity問題

大家好:
想請教各位大大
以下是我的程式
JAVA 和JSP部分

//JAVA
public List Getdata()
{String sql="select* from product";
Query query=session.createSQLQuery(sql).addEntity(Product.class);      
return query.list();
}
//JSP
 List <Product> a=log.Getdata();
    for(Product num : a)
    {out.println(num.getName()+ ", " +num.getPrice());
    }

以上程式是OK的
但如果我用2個.addEntity()就會無法在JSP print出來
以下我的程式

//JAVA
    public List st()
    {
  String sql="select{s.*}, {p.*} from stock s left join product p on p.name=s.id ";
 Query q= session.createSQLQuery(sql).addEntity("s",Stock.class)
		                             .addEntity("p", Product.class);      return q.list(); 
    } 
    //JSP
     List <Object[]> stu=log.st();
     for(Object[] obj : stu)
            {
                Stock s = (Stock)obj[0];
                Product p = (Product)obj[1];
                out.println(s.getId() + ", " + p.getPrice() );
            }

但這樣他就會出現以下訊息
HTTP Status 500 - An exception occurred processing JSP page /a.jsp at line 37
java.lang.NullPointerException
想請問該怎麼改才可以正常
謝謝
以下我參考的文章:
http://www.cnblogs.com/xiaoluo501395377/p/3378355.html

1 個回答

1
暐翰
iT邦大師 2 級 ‧ 2018-03-22 15:50:03
最佳解答

原因:

資料中關聯的欄位的值有null導致

舉例:

我有員工(EMP2)跟部門(DEPT2)表格
關係是多(員工)對一(部門)
兩個表格都有部門NO的欄位

員工表格沒有設定欄位不能null
這時候設定其中一個員工的部門是null

跑程式的時候可以發現因為是null,所以部門的物件值為null

這時候再對部門的物件強轉型取值就會導致nullpoint

解決方法:

再取值的地方做null判斷就可以

舉例

deptvo.getDname()

改成

(deptvo==null?"":deptvo.getDname()) );

就可以


以上概念明白,要解決你的問題

JSP部分改成以下範例就可以 :-)

//JSP
List <Object[]> stu=log.st();
for(Object[] obj : stu)
{
    Stock s = (Stock)obj[0];
    Product p = (Product)obj[1];
    out.println(s.getId()  + ", " + (p==null?"":p.getPrice()) );
}

--------以下新增問題--------

問題:

這樣的話是不是我就不用再寫p.name=s.id了?

我看你的表格邏輯,是一定要寫。
因為不寫你會取到其他商品的價格

因為使用left join on p.name=s.id意思就是想得出
我這次www 有7個量,而www的價格是5
而不使用你會得到多個結果
www 7個商品量,而www的價格是aaa商品的5 和 zzz的20....

所以一定要用。


問題:

null那邊我還是不太明白

造成這個原因是因為資料是髒的
為什麼這麼說因為明明jjj商品有量,但卻沒有價格,這樣很奇怪。
而java只是如實資料呈現
接著延伸基礎原則,任何null被呼叫方法都會跳出
nullpoint exception

所以准許髒資料,就要在java對null的情況特別處理邏輯


問題:

是不是要以product為基準,product有的東西stock才能有阿..?

對,同上個問題回答
假如有其他邏輯再跟我說 :-)

--------以下新增第二個問題--------

問題:

我要找出那些學生同時修A,B課程

使用Inner Join

範例:

連結:【找出那些學生同時修A,B課程】

create TABLE 課程表格 (課程 nvarchar(10),學號 nvarchar(10) );
insert into 課程表格 (課程,學號) values 
	('A0001','T0023')
    ,('A0001','T0089')
    ,('A0001','T0058')
    ,('A0002','T0023')
    ,('A0002','T0034')  
	,('A0002','T0058')  
;

select * from (select * from 課程表格 where 課程 = 'A0001') A課程
inner join (select * from 課程表格 where 課程 = 'A0002') B課程 on A課程.學號 = B課程.學號
;


看更多先前的回應...收起先前的回應...
神威 iT邦新手 3 級 ‧ 2018-03-23 09:57:30 檢舉

暐翰大大好
那個想請教幾個問題

1.以下是我的資料表
https://ithelp.ithome.com.tw/upload/images/20180323/20102983xXU5hF7gc8.png
照大大的方法可行,但是我在stock data中加了一行jjj,2就會出現
錯誤碼:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [model.Product#jjj]

是不是要以product為基準,product有的東西stock才能有阿..?

2.null那邊我還是不太明白

String sql="select {s.*}, {p.*} from stock s left join product p on p.name=s.id ";

我都已經寫p.name=s.id那他不會在java端過濾,一定要在JSP上面寫
(p==null?"":p.getPrice())才行,這樣的話是不是我就不用再寫p.name=s.id了?

謝謝大大解答

暐翰 iT邦大師 2 級 ‧ 2018-03-23 10:27:50 檢舉

我上面更新回答了
有問題再跟我說 :-)

神威 iT邦新手 3 級 ‧ 2018-03-23 15:12:45 檢舉

暐翰
想再請教大大一個問題
如果我有A,B二門課程
我要找出那些學生同時修A,B課程
這樣就又會出現錯誤了,對吧?(因為只能以其中一個為基準
那要怎麼改呢?
https://ithelp.ithome.com.tw/upload/images/20180323/20102983dvs6z1V5DG.png
謝謝

暐翰 iT邦大師 2 級 ‧ 2018-03-23 15:22:50 檢舉

我更新回答了

神威 iT邦新手 3 級 ‧ 2018-03-26 11:03:02 檢舉

暐翰
謝謝妳,我了解了

我要發表回答

立即登入回答