射影クエリとは、図に示すように、ドロップダウン ボックスをクリックしてデータベースのデータ ディクショナリ テーブルにある既存のデータ型名を表示し、重複することなくドロップダウン メニューに移動することを指します
public class ElecSystemDDLAction extends BaseAction<ElecSystemDDL>{ ElecSystemDDL elecSystemDDL=this.getModel(); //注入数据字典service@Resource(name=IElecSystemDDLService.SERVICE_NAME) IElecSystemDDLService elecSystemDDLService; /** * @Name: home * @Description: 跳转到数据字典页面 * @Parameters: 无 * @Return: String:跳转到system/dictionaryIndex.jsp*/public String home(){// 1:查询数据库中已有的数据类型,返回List<ElecSystemDDL>集合 List<ElecSystemDDL> list=elecSystemDDLService.findSystemDDLListByDistinct(); // 2:将ElecSystemDDL对象放入request中 request.setAttribute("list", list);return "home"; } }
public interface IElecSystemDDLService {public static final String SERVICE_NAME="cn.elec.service.impl.ElecSystemDDLServiceImpl"; List<ElecSystemDDL> findSystemDDLListByDistinct(); }
public class ElecSystemDDLServiceImpl implements IElecSystemDDLService{//数据字典Dao@Resource(name=IElecSystemDDLDao.SERVICE_NAME)private IElecSystemDDLDao elecSystemDDLDao; /** * @Name: findSystemDDLListByDistinct * @Description: 查询数据库中已有的数据类型,去掉重复值 * @Parameters: 无 * @Return: List:存储数据类型集合*/@Override @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)public List<ElecSystemDDL> findSystemDDLListByDistinct() { List<ElecSystemDDL> list=elecSystemDDLDao.findSystemDDLListByDistinct();return list; } }
public interface IElecSystemDDLDao extends ICommonDao<ElecSystemDDL> {public static final String SERVICE_NAME="cn.elec.dao.imp.ElecSystemDDLImpl"; List<ElecSystemDDL> findSystemDDLListByDistinct(); }
@Repository(IElecSystemDDLDao.SERVICE_NAME)public class ElecSystemDDLImpl extends ICommonDaoImpl<ElecSystemDDL> implements IElecSystemDDLDao{/** * @Name: findSystemDDLListByDistinct * @Description: 查询数据库中已有的数据类型,去掉重复值 * @Parameters: 无 * @Return: List:存储数据类型集合*/@Overridepublic List<ElecSystemDDL> findSystemDDLListByDistinct() {//返回List集合List<ElecSystemDDL> systemList = new ArrayList<ElecSystemDDL>();/**方法一:投影查询一个字段返回List<Object>中 String hql="SELECT DISTINCT o.keyword FROM ElecSystemDDL o"; List<Object> list = this.getHibernateTemplate().find(hql); //组织页面返回结果 if(list!=null&&list.size()>0){ for(Object obj:list){ ElecSystemDDL elecSystemDDL = new ElecSystemDDL(); //设置数据类型,并添加到systemList elecSystemDDL.setKeyword(obj.toString()); systemList.add(elecSystemDDL); } }*///方法二:使用hql语句直接将投影查询的字段放置到对象中String hql="SELECT DISTINCT new cn.elec.domain.ElecSystemDDL(o.keyword) FROM ElecSystemDDL o"; systemList=this.getHibernateTemplate().find(hql);return systemList; } }
2 番目のクエリ ソリューションでは、ElecSystemDDL でパラメーターを使用してコンストラクターを作成する必要があります:
public ElecSystemDDL() {//无参构造方法} public ElecSystemDDL(String keyword) {//带参构造方法this.keyword=keyword; }
リストなので< ;ElecSystemDDL> コレクションは、Actionl クラスのリクエスト オブジェクトに配置され、属性名は list です。 Dictionary.jsp ページが request.list を取得するとき、ElecSystemDDL オブジェクトのキーワード属性を調べて、それをドロップダウン オプション ボックスに入れる必要があります。
<tr> <td class="ta_01" align="right" width="35%" >类型列表:</td> <td class="ta_01" align="left" width="30%" > <!-- 方案一 <select name="keyword" class="bg" style="width:180px" onchange="changetype()"> <option value="jerrynew"></option> <s:iterator value="#request.list" var="sys"> <option value="<s:property value="#sys.keyword"/>"> <s:property value="#sys.keyword"/> </option> </s:iterator> </select> --> <!-- 方案二 --> <s:select list="#request.list" name="keyword" id="keyword" listKey="keyword" listValue="keyword" headerKey="jerrynew" headerValue="" cssClass="bg" cssStyle="width:180px" onchange="changetype()"> </s:select> </td> </tr>
テスト、データ ディクショナリのホームページ機能ページのドロップダウン メニューの型名が正しく表示されます。
1. HQL および SQL ステートメントの射影クエリ:
(1) 射影クエリがフィールドの場合、この時点で List
String hql = "SELECT DISTINCT o.keyword FROM ElecSystemDDL o"; List<Object> list = this.getHibernateTemplate().find(hql);
)。射影クエリが複数フィールドの場合、List
String hql = "SELECT DISTINCT o.keyword,o.ddlName FROM ElecSystemDDL o"; List<Object[]> list = this.getHibernateTemplate().find(hql);
) (3) 射影クエリが複数フィールドの場合、List
String hql = "SELECT o,o.ddlName FROM ElecSystemDDL o"; List<Object[]> list = this.getHibernateTemplate().find(hql);
配列の最初の値は ElecSystemDDL オブジェクトで、配列の 2 番目の値はフィールド ddlName の値を表します。
(4) 射影クエリがオブジェクトの場合、
String hql = "SELECT o FROM ElecSystemDDL o"; List<ElecSystemDDL> list = this.getHibernateTemplate().find(hql);
などの List
String hql = "SELECT DISTINCT new cn.itcast.elec.domain.ElecSystemDDL(o.keyword) FROM ElecSystemDDL o"; List<ElecSystemDDL> list = this.getHibernateTemplate().find(hql);
(1) 解決策 1:
<select name="keyword" class="bg" style="width:180px" onchange="changetype()"> <option value="jerrynew"></option> <s:iterator value="#request.list" var="system"> <option value="<s:property value="#system.keyword"/>"> <s:property value="#system.keyword"/> </option> </s:iterator> </select>
(2 ) オプション 2:
<s:select list="#request.list" name="keyword" id="keyword"listKey="keyword" listValue="keyword"headerKey="jerrynew" headerValue=""cssClass="bg" cssStyle="width:180px" onchange="changetype()"> </s:select>
以上がデータディクショナリ設計の射影クエリ方式の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。