hibernate返回非受管实体(Returning non-managed entities)不能别名注射?

本文探讨了在使用SSH集成Hibernate进行数据库查询时遇到的别名注入问题,详细解释了如何通过调整查询语句和结果转换器来避免别名冲突,确保返回正确的非受管实体列表。同时,提供了OrderDTO类的设计建议,强调驼峰命名的重要性以避免语法错误。

 直接上码!

public class OrderDao extends BaseDao<String, Orders> implements IOrderDao {

	@SuppressWarnings("unchecked")
	public List<OrderDTO> getOrdersByUsername(String username) {
		
		String sql = "SELECT"
		      + " BILLADDR1 as {billaddr1},"
		      + "BILLADDR2 as {billaddr2},"
		      + "BILLCITY as {billCity},"
		      + "BILLCOUNTRY as {billCountry},"
		      + "BILLSTATE as {billState},"
		      + "BILLTOFIRSTNAME as {billToFirstName},"
		      + "BILLTOLASTNAME as {billToLastName},"
		      + "BILLZIP as {billZip},"
		      + "SHIPADDR1 as {shipaddr1},"
		      + "SHIPADDR2 as {shipaddr2},"
		      + "SHIPCITY as {shipCity},"
		      + "SHIPCOUNTRY as {shipCountry},"
		      + "SHIPSTATE as {shipState},"
		      + "SHIPTOFIRSTNAME as {shipToFirstName},"
		      + "SHIPTOLASTNAME as {shipToLastName},"
		      + "SHIPZIP as {shipZip},"
		      + "CARDTYPE as {cardType},"
		      + "COURIER as {courier},"
		      + "CREDITCARD as {creditCard},"
		      + "EXPRDATE as {exprdate},"
		      + "LOCALE as {locale},"
		      + "ORDERDATE as {orderDate},"
		      + "ORDERS.ORDERID as {orderId},"
		      + "TOTALPRICE as {totalPrice},"
		      + "USERID as {userid},"
		      + "STATUS as {status}"
		      + " FROM ORDERS ,ORDERSTATUS"
		      + " WHERE ORDERS.USERID = ?"
		      + " AND ORDERS.ORDERID = ORDERSTATUS.ORDERID"
		      + " ORDER BY ORDERDATE";
		Query query = this.getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(OrderDTO.class));
		query.setString(0, username);
		return query.list();
	}

 上面是ssh集成,hibernate查询。

 

返回非受管实体,结果转换器返回OrderDTO的列表。

 

以下是OrderDTO类:

public class OrderDTO implements Serializable {

	private static final long serialVersionUID = 6321792448424424931L;

	private int orderId;
//	private String username;
	private String userid;
	private Date orderDate;
//	private String shipAddress1;
//	private String shipAddress2;
	private String shipaddr1;
	private String shipaddr2;
	private String shipCity;
	private String shipState;
	private String shipZip;
	private String shipCountry;
	// private String billAddress1;
	// private String billAddress2;
	private String billaddr1;
	private String billaddr2;
	private String billCity;
	private String billState;
	private String billZip;
	private String billCountry;
	private String courier;
	private BigDecimal totalPrice;
	private String billToFirstName;
	private String billToLastName;
	private String shipToFirstName;
	private String shipToLastName;
	private String creditCard;
//	private String expiryDate;
	private String exprdate;
	private String cardType;
	private String locale;
	private String status;
	private List<LineItemDTO> lineItems = new ArrayList<LineItemDTO>();

 get,set方法省略。

 

执行上面的查询,有语法错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'BILLADDR2 as ,BILLCITY as ,BILLCOUNTRY as ,BILLSTATE as ,BILLTOFIRSTNAME as ,BIL' at line 1

 应该是不能取别名。

 

如果不用别名注射(alias injection names) ,OrderDTO中属性不能使用驼峰命名,属性必须全部小写才能正确返回。

 

求教育!求爽!

### 修复 `warning: no return statement in function returning non-void` 的方法 在 C/C++ 编程中,当一个函数被声明为返回 `void` 类型(例如 `int`、`bool` 或自定义类型),但函数体中缺少 `return` 语句时,编译器会生成警告信息:`warning: no return statement in function returning non-void [-Wreturn-type]`。这种警告通常意味着函数没有明确返回值,可能导致未定义行为[^2]。 #### 1. 确保所有代码路径都有返回值 最直接的解决方式是检查函数的所有执行路径,并确保每条路径都包含 `return` 语句。例如: ```cpp bool is_even(int num) { if (num % 2 == 0) { return true; } else { return false; } } ``` 上述代码保证了无论条件是否满足,函数都会返回一个布尔值。 #### 2. 使用默认返回值 如果函数逻辑较为简单,可以统一使用一个默认返回值作为兜底: ```cpp int get_status_code(bool success) { if (success) { return 200; } return -1; // 默认错误码 } ``` 这种方式可以避免因遗漏某些分支而造成无返回值的问题。 #### 3. 对于递归或复杂控制流的情况 在涉及递归、循环或多层嵌套逻辑的函数中,需要特别注意每个出口点是否都包含 `return` 语句。建议使用调试工具或静态分析工具辅助检查此类问题。 #### 4. 启用并重视编译器警告 可以通过启用 `-Wall` 或 `-Wreturn-type` 编译选项来捕获这类潜在问题。这些选项可以让编译器更严格地检查代码中的可疑结构,从而帮助开发者尽早发现问题并修复[^1]。 #### 5. 避免依赖编译器自动优化 某些编译器可能在特定优化级别下自动插入返回值(如返回寄存器中的随机值),但这属于未定义行为。不同平台或编译器处理方式不一致,容易导致程序在某些环境下崩溃。应始终显式提供返回值以确保跨平台兼容性[^4]。 --- ### 示例修复前后对比 **修复前(存在警告)** ```cpp bool test_bool() { } // 缺少 return 语句 ``` **修复后(无警告)** ```cpp bool test_bool() { return true; // 添加明确返回值 } ``` --- ### 总结 解决该警告的核心在于确保每个 `void` 函数在所有可能执行路径上都具有明确的 `return` 语句。忽略此类警告可能导致运行时错误,甚至引发法指令异常[^3]。因此,在开发过程中应始终认真对待并修复编译器警告。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值