php findbysql,hibernate的findByExample

用了这么长时间的hibernate/spring,如果不是今天用的findByExample方法到现在还不知道findByExample的机制。惭愧

Class User{

String username;

String password = "默认口令";

Company company;

getter()&setter().....

}

Company company = companyDao.getById("id");

User user = new User();

user.setSid("主键");

uer.setUsername("user");

use.setCompany(company);

userDao.findByExample(user);

这个时候的SQL条件为:

select * from user

where username = ?

and password = ?

findByExample()使用时得出结论:

1.不支持主键

2.不支持关联

3.不支持NULL

查询示例

org.hibernate.criterion.Example

类允许你通过一个给定实例构建一个条件查询。

此实例的属性值将做成查询条件。

Java代码

Cat cat = new Cat();

cat.setSex('F');

cat.setColor(Color.BLACK);

List results = session.createCriteria(Cat.class)

.add( Example.create(cat))

.list();

Example.create(cat) 表示根据cat这个对象来构造一个查询条件。

上面这条语句将查询sex 为 F 而且Color为BLACK的所有Cat记录。

版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。

可以自行调整Example使之更实用。

Java代码

Example example = Example.create(cat)

.excludeZeroes() //排除值为0的属性

.excludeProperty("color")

//排除 color属性

.ignoreCase() //忽略大小写

.enableLike(); //启用模糊查询

List results = session.createCriteria(Cat.class)

.add(example)

.list();

甚至可以使用examples在关联对象上放置条件。

Java代码

List results = session.createCriteria(Cat.class)

.add( Example.create(cat) )

.createCriteria("mate")

.add( Example.create( cat.getMate() ) )

.list();

关于使用Hibernate findByExample的注意事项

from:http://www.85java.com/viewthread.php?tid=2259

findByExample是一个很便利的查询的方法,通过传入的实例,进行条件匹配生成查询语句。

但之前一直很少用这个方法,原因是之前发现不知道什么情况下查询结果跟自己想要生成的不同。还是学习方式不同吧,对于陌生的东西出现问题了就不管不用了,这样是不行了。现在又遇到了,却很快的发现问题所在了。

原因其实很简单,findByExample只为example中的基本类型属性生效,如果example的属性中有bean的话(一般有外键时就会出现了)就会无法转成SQL查询条件。甚至很多时候会产生where

(1=1)的条件,相信会令人很迷惑。

解决办法很简单吧,遇到这种情况可以直接使用SQL或条件查询(Criteria),更推荐使用Criteria。

下面是查询参考:

Java代码

@Override

public AppsAccount findByUserAndApp(Users user, Apps app) {

final DetachedCriteria query = DetachedCriteria

.forClass(AppsAccount.class);

Criteria criteria =

query.getExecutableCriteria(getSession());

criteria.add(Restrictions.eq("users", user));

criteria.add(Restrictions.eq("apps", app));

@SuppressWarnings("unchecked")

List list =

criteria.list();

if (list != null &&

!list.isEmpty()) {

return list.get(0);

}

return null;

}

@Override

public AppsAccount findByUserAndApp(Users user, Apps app) {

final DetachedCriteria query = DetachedCriteria

.forClass(AppsAccount.class);

Criteria criteria =

query.getExecutableCriteria(getSession());

criteria.add(Restrictions.eq("users", user));

criteria.add(Restrictions.eq("apps", app));

@SuppressWarnings("unchecked")

List list =

criteria.list();

if (list != null &&

!list.isEmpty()) {

return list.get(0);

}

return null;

}

因为是跟spring整合,所以用getSession()方法传入session。

AppsAccount.class类

Java代码

public class AppsAccount implements java.io.Serializable {

// Fields

private static final long serialVersionUID =

2255050572597512586L;

private String id;

private Users users;

private Apps apps;

private String account;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值