QQ斗地主记牌器下载怎么找不到在哪,高分求解,急急急

QQ斗地主记牌器开发实践 - CSDN博客
QQ斗地主记牌器开发实践
这是我2005年写的一个小程序,原来放在BOKEE上的,最近BOKEE经常打不开,打开的时候也是极慢、图片显不出来,中国最早的博客要关门了?为了不把程序弄丢了,还是转移到这里来吧。
由于前段时间玩起了QQ斗地主,从网上下载了一个QQ斗地主记牌器,但无法使用,于是就想自己开发一个。
一、记牌器实现的原理
当时查阅了一些资料,想到了三种实现的方法:
1、拦截IP包。这种方法应该是可行的,只是从查阅的资料来看,现在的游戏IP包都经过加密处理了,而且分析IP包的工作量比较大,所以就没采用这种方法。这方面使用的软件有:WPE(拦截发送封包),m2m封包分析。
2、拦截QQ斗地主显示扑克牌的函数。用W32DSM分析了斗地主的几个相关exe和dll竟然没找到显示扑克牌的函数:(。一开始觉得最可疑的应该是QQGame目录下的CardRes.dll,但分析后发现它竟没有程序出口。
3、屏幕抓图。感觉这种方法是最简单的了,觉得纯粹就是抓图,然后分析图形就行了。当时下载的记牌器应该也是应用这种方法实现的,但是它又不能用,网上又有评论说它被腾讯怎么给弄失效了。不管了,试试再说。
二、从图形分析开始
这是抓获的每张牌的区域,下图为放大后的效果,图中绿色网格为参考坐标,经过分析,发现只要使用12行X4列的区域就可以确定出牌的大小,使用20行X4列的区域就可以确定出大小和类型了。刚开始的时候,打算每次捕抓一张牌的区域,但是这样要想定的定义一系列的HBITMAP,不方便,所以就改为一列牌捕捉分析一次。考虑到一家的牌最多20张,而20张牌的屏幕区域为356X20像素。
分析牌大小和类型的函数如下:
//判断hdc中的牌
//////////////////////////////////////////////////////
BOOL CCard::Check(HDC hdc)
BYTE g_color, color1, color2;
// int i=1;
int nCardWidth=15; //每张牌的宽度为15像素
int nOffset = 2;
//牌边框与值之类的像素,见图片说明
for(int i=0; i&20; i++)
if(GetColor(hdc, 13, 1+i*nCardWidth)!= 0)
//找不到黑色的边框,说明没有牌
color1=GetColor(hdc, 1, 68+i*nCardWidth);
if(color1 &20 && color1 &150)
//表示为底色,此值为随便取的,视底色范围
if(GetColor(hdc, 1, 1+nOffset+i*nCardWidth) ==0)
value[i] = 13;
if(GetColor(hdc, 1,2+nOffset+i*nCardWidth) ==0 )
if((color1=GetColor(hdc,7,2+nOffset+i*nCardWidth))==0)
value[i] = 10;
value[i] = 5;
if((g_color=GetColor(hdc, 2,2+nOffset+i*nCardWidth)) ==0)
value[i] = 12;
if(GetColor(hdc, 12, 2+nOffset+i*nCardWidth) == 0)
value[i] = 1;
if(GetColor(hdc, 12, 1+nOffset+i*nCardWidth) == 0)
value[i] = 1;
if(GetColor(hdc, 6, 2+nOffset+i*nCardWidth) == 0)
value[i] = 4;
if(GetColor(hdc, 9, 2+nOffset+i*nCardWidth)== 0)
value[i] =11;
if((g_color=GetColor(hdc, 1, 3+nOffset+i*nCardWidth)) == 0)
if((color1=GetColor(hdc, 4,3+nOffset+i*nCardWidth)) ==0)
value[i] = 5;
if((color2=GetColor(hdc, 10, 3+nOffset+i*nCardWidth)) == 0)
value[i] = 3;
value[i] =7;
if(GetColor(hdc, 12, 3+nOffset+i*nCardWidth) ==0)
value[i] = 2;
if((color1=GetColor(hdc, 2, 3+nOffset+i*nCardWidth)) == 0)
if((GetColor(hdc, 6, 3+nOffset+i*nCardWidth)) ==0)
value[i] = 9;
value[i] = 8;
if(GetColor(hdc, 3, 3+nOffset+i*nCardWidth)==0)
value[i] = 6;
if(GetColor(hdc,1,1+nOffset+i*nCardWidth) == 255)
value[i] = 0;
value[i] = 14;
//判断花色
////////////////////////////////////////////////////////////////////
for(i=0; i&20; i++)
if(value[i] == 14)
type[i]=4;
if(value[i] == 0)
type[i]=0;
//先默认为大王
if(GetColor(hdc, 8, 4+nOffset+i*nCardWidth) & 250)
type[i]=1;
if(value[i]&0 && value[i]&11)
//牌为A、2-10时,花色的区域相同,为一种
if(GetColor(hdc, 20, 2+nOffset+i*nCardWidth) == 255) //方片A
type[i]=3;
if(GetColor(hdc, 17, 2+nOffset+i*nCardWidth) == 0) //红桃
type[i]=1;
if(GetColor(hdc, 18, 2+nOffset+i*nCardWidth) == 0) //方片
type[i]=3;
if(GetColor(hdc, 18, 4+nOffset+i*nCardWidth) == 0) //黑桃
type[i]=0;
type[i]=2;
if(value[i]&=11 && value[i]&=13)
//牌值为J-K时,花色区域为另一种
if(GetColor(hdc, 17, 1+nOffset+i*nCardWidth) == 0) //红桃
type[i]=1;
if(GetColor(hdc, 19, 1+nOffset+i*nCardWidth) == 255)//方片
type[i]=3;
if(GetColor(hdc, 16, 3+nOffset+i*nCardWidth) == 0) //黑桃
type[i]=2;
type[i]=0;
return TRUE;
//取得第row行,col列的G值,注意参数为先行后列,而且是1开始而非从0开始的
//原先是为了计算单张牌的方便,才采用了行列而非坐标,以至后来调试多花了好多时间^-^(是忘了这个规则了)
BYTE CCard::GetColor(HDC hdc, int row, int col)
COLORREF crC
crColor = GetPixel(hdc, col-1, row-1);
//取得第row行,col列的RGB值
//分离出蓝色值,为什么用蓝色呢,看看抓图的像素就知道了
//红色的G值为0,黑色的G值为0,而白色的G值为255,所以判断一下G值就知道是什么牌了
temp=GetGValue(crColor);
//分离出蓝色值
上图为各捕捉区域左上角的屏幕坐标,自己、左家、右家的牌一次捕捉356X20的区域,进行一次分析。底牌区域的坐标仅用于参考,视算法而定要不要进行分析(我的程序因为是旁观别人的牌进行分析的,自己的牌是一次分析出来的,后来自己玩的时候发现了一个问题,自己当地主时,底牌拿到手时跟其它的牌不是成一条线的!所以还要用到底牌区的区域来分析)。
三、屏幕抓图函数
可参见我的博客中其它的文章。我的思路是自己的牌抓一次,左右家的牌两家一起抓一次。因为左右家出的牌较多时,两家的牌会有一部分重叠在一起,但是经过分析,可以知道这两部分每张牌之间都是错开的,所以还是可以一次处理的。
另:使用spy++分析QQ斗地主的各个窗口坐标,可知:主窗口的左上角坐标为(-4,-4),而牌区的左上角坐标为(1,30),牌区的长宽为736X696像素。
我用的函数如下:
void CCaptureDlg::OnMiddle()
// TODO: Add your control notification handler code here
CCard cardL
int nLordX=212, nLordY=554;
HDC hdcScreen, hMemDC;
HBITMAP hBitmap, hOldB
HBITMAP hBitmap1, hOldBitmap1;
//建立一个屏幕设备环境句柄
hdcScreen = CreateDC(&DISPLAY&, NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hdcScreen);
hMiddleDC = CreateCompatibleDC(hdcScreen);
*/ //建立一个与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图
hBitmap = CreateCompatibleBitmap(hdcScreen, nWidth, nHeight);
hBitmap1 = CreateCompatibleBitmap(hdcScreen, 356, 20);
// 把屏幕设备描述表拷贝到内存设备描述表中
hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap);
hOldBitmap1 = (HBITMAP) SelectObject(hMiddleDC, hBitmap1);
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hdcScreen, rectCapture.left+5, rectCapture.top+34,SRCCOPY);
if(cardLord.GetColor(hMemDC, nLordY, nLordX-1) ==255)
nLordX -= 22;
BitBlt(hMiddleDC, 0, 0, 356,20, hMemDC, nLordX, nLordY, SRCCOPY);
cardLord.Check(hMiddleDC);
/* CString str1, str2, str3;
str2.Empty();
str2.Format(_T(&自己的牌:\n&));
for(int i=0; i&20; i++)
str1.Format(_T(&%4d&), cardLord.GetValue(i));
str2 += str1;
str1.Format(_T(&%4d&), cardLord.GetType(i));
str3 += str1;
str2+=&\n&;
str2+=str3;
AfxMessageBox(str2);
hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap);
hBitmap1 =(HBITMAP)SelectObject(hMiddleDC, hOldBitmap1);
DeleteDC(hMiddleDC);
DeleteDC(hdcScreen);
DeleteDC(hMemDC);
// 返回位图句柄
//打开剪贴板,并将位图拷到剪贴板上
OpenClipboard() ;
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap1);
//关闭剪贴板
CloseClipboard();
// MessageBox(&屏幕内容已经拷到剪贴板上!&);
//终止鼠标捕获
ReleaseCapture();
//恢复窗口显示模式
// ShowWindow(SW_NORMAL);
DeleteItem(cardLord);
void CCaptureDlg::OnLeft()
// TODO: Add your control notification handler code here
// KillTimer(1);
CCard cardLeft, cardR
int nLeftX=172, nLeftY=272;
int nRightX=208, nRightY=272;
/* HDC hdcScreen, hMemDC;
HBITMAP hBitmap, hOldB
HBITMAP hBitmap1, hOldBitmap1;
HBITMAP hBitmap2, hOldBitmap2;
//建立一个屏幕设备环境句柄
hdcScreen = CreateDC(&DISPLAY&, NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hdcScreen);
hLeftDC = CreateCompatibleDC(hdcScreen);
hRightDC = CreateCompatibleDC(hdcScreen);
//建立一个与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图
hBitmap = CreateCompatibleBitmap(hdcScreen, nWidth, nHeight);
hBitmap1 = CreateCompatibleBitmap(hdcScreen, 356, 20);
hBitmap2 = CreateCompatibleBitmap(hdcScreen, 356, 20);
// 把屏幕设备描述表拷贝到内存设备描述表中
hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap);
hOldBitmap1 = (HBITMAP) SelectObject(hLeftDC, hBitmap1);
hOldBitmap2 = (HBITMAP) SelectObject(hRightDC, hBitmap2);
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hdcScreen, rectCapture.left+5, rectCapture.top+34,SRCCOPY);
BitBlt(hLeftDC, 0, 0, 356,20, hMemDC, nLeftX, nLeftY, SRCCOPY);
BitBlt(hRightDC, 0, 0, 356,20, hMemDC, nRightX, nRightY, SRCCOPY);
cardLeft.Check(hLeftDC);
cardRight.Check(hRightDC);
DeleteItem(cardLeft);
DeleteItem(cardRight);
DeleteDC(hdcScreen);
DeleteDC(hMemDC);
DeleteDC(hLeftDC);
DeleteDC(hRightDC);
hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap);
hBitmap1 =(HBITMAP)SelectObject(hLeftDC, hOldBitmap1);
hBitmap2 =(HBITMAP)SelectObject(hRightDC, hOldBitmap2);
// SetTimer(1, 2000, NULL);
四、主程序
主程序采用4个列表来记牌,为什么不用一个列表来实现呢?因为列表只能在第一列能够同时显示图标和文字,所以用了4个列表。下方的5个按钮是用来测试各个函数的,调试用的。代码如下:
BOOL CCaptureDlg::OnInitDialog()
CDialog::OnInitDialog();
// Add &About...& menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX & 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
CString strAboutM
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
pSysMenu-&AppendMenu(MF_SEPARATOR);
pSysMenu-&AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
//加入WS_EX_LAYERED扩展属性
//设置窗口为半透明
SetWindowLong(this-&GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this-&GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary(&User32.DLL&);
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, &SetLayeredWindowAttributes&);
if(fun)fun(this-&GetSafeHwnd(),0,255,2);
FreeLibrary(hInst);
//将窗口设为最前
::SetWindowPos(this-&m_hWnd,HWND_TOPMOST,815,395,0,0,SWP_NOSIZE);
// return TRUE
unless you set the focus to a control
// Set the icon for this dialog.
The framework does this automatically
when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);
// Set big icon
SetIcon(m_hIcon, FALSE);
// Set small icon
// TODO: Add extra initialization here
bCapture=FALSE;
bLord = FALSE;
bMiddle = FALSE;
bLeft = FALSE;
bRight = FALSE;
bMiddle1 = FALSE;
bLeft1 = FALSE;
bRight1 = FALSE;
hwndCapture = ::FindWindow(NULL, &斗地主&);
::GetWindowRect(hwndCapture,&rectCapture);
nWidth=rectCapture.Width();
nHeight=rectCapture.Height();
if(nWidth != 1032 || nHeight != 746)
MessageBox(&斗地主的主窗口尺寸不对!\n\n检查显示器分辨率:请调整为\n并将斗地主窗口最大化\n\n不便之处,敬请原谅!&);
InitList();
//建立一个屏幕设备环境句柄
hdcScreen = CreateDC(&DISPLAY&, NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hdcScreen);
hMiddleDC = CreateCompatibleDC(hdcScreen);
hLeftDC = CreateCompatibleDC(hdcScreen);
hRightDC = CreateCompatibleDC(hdcScreen);
SetTimer(1,2000,NULL);
return TRUE;
// return TRUE
unless you set the focus to a control
//初始化4个列表
////////////////////////////////////////////////////////////////////////////////////////////////
void CCaptureDlg::InitList()
char str1[15][5]={&3&,&4&,&5&,&6&,&7&,&8&,&9&,&10&,&J&,&Q&,&K&,&A&,&2&,&王&,&无牌&};
//载入4种花色的图标
SmallImage.Create(14, 14, ILC_COLOR8 | ILC_MASK, 4, 1);
CBitmap cB
cBmp.LoadBitmap(IDB_BITMAP1);
SmallImage.Add(&cBmp, RGB(255,255,255));
cBmp.DeleteObject();
cBmp.LoadBitmap(IDB_BITMAP2);
SmallImage.Add(&cBmp, RGB(255,255,255));
cBmp.DeleteObject();
cBmp.LoadBitmap(IDB_BITMAP3);
SmallImage.Add(&cBmp, RGB(255,255,255));
cBmp.DeleteObject();
cBmp.LoadBitmap(IDB_BITMAP4);
SmallImage.Add(&cBmp, RGB(255,255,255));
cBmp.DeleteObject();
//初始化4个列表
for(i=0; i&4; i++)
m_list[i].SetImageList(&SmallImage, LVSIL_SMALL);
m_list[i].InsertColumn(0,&&);
m_list[i].SetColumnWidth(0,50);
CString strI
for(j=0; j&4; j++)
for(i=0;i&13;i++)
lvi.mask = LVIF_IMAGE|LVIF_TEXT;
lvi.iItem =
lvi.iSubItem = 0;
lvi.iImage=j;
strItem.Format(_T(&%s&),str1[i]);
lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
m_list[j].InsertItem(&lvi);
//记下大小王
iconJoke1 = m_joke1.GetIcon();
iconJoke2 = m_joke2.GetIcon();
bMiddle1 = TRUE;
五、存在的问题
使用主界面下方的按钮来测试各个函数,可以正常捕捉记牌,但是使用OnTimer()来自动记牌时,记一段时间就出错了,是什么问题呢?
该采用什么算法来激活捕捉分析程序呢?欢迎大家跟我探讨。
本文已收录于以下专栏:
相关文章推荐
简介斗地主记牌器就是把别人打过的牌记录下来,排除自己的手牌,然后算出别人手里面还有哪些牌,这样对自己能够赢大有裨益。这种东西QQ斗地主已经自己附带了,但是对于我这种没钱冲QQ会员的人来说,我自己还是做...
关注公众号
在公众号里回复“”秘密“”两个字
http://task.csdn.net/m/task/home?task_id=398 领取奖励
提示:根据公众号里的自动回复,完成...
观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统、订阅——发布系统等。因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI...
LinearLayout xmlns:android=&/apk/res/android&
xmlns:app=&http://schema...
JavaEE 6及以上版本的web.xml问题?MyEclipse JavaEE 6版本开始web.xml突然消失不见?没这回事,只是不太必须而已,有需要的项目可以自行进行添加或在创建项目的时候点击n...
注:本文的高斯模糊只能显示,如果想要保存模糊后的图片,请参考另一篇文章:http://blog.csdn.net/fan7983377/article/details/
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急。。。。。报错啊,高分求解啊,
100weihui5368452]
编辑:www.fx114.net
本篇文章主要介绍了"急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急。。。。。报错啊,高分求解啊,
100weihui5368452]",主要涉及到急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急。。。。。报错啊,高分求解啊,
100weihui5368452]方面的内容,对于急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急。。。。。报错啊,高分求解啊,
100weihui5368452]感兴趣的同学可以参考一下。
org.springframework.orm.hibernate3.HibernateQueryException:&could&not&resolve&property:&roleId&of:&com.wei.entity.Roleright&[delete&from&com.wei.entity.Roleright&where&roleinfo.roleId=1];&nested&exception&is&org.hibernate.QueryException:&could&not&resolve&property:&roleId&of:&com.wei.entity.Roleright&[delete&from&com.wei.entity.Roleright&where&roleinfo.roleId=1]
Caused&by:&org.hibernate.QueryException:&could&not&resolve&property:&roleId&of:&com.wei.entity.Roleright&[delete&from&com.wei.entity.Roleright&where&roleinfo.roleId=1]
at&org.hibernate.persister.entity.AbstractPropertyMapping.throwPropertyException(AbstractPropertyMapping.java:43)
at&org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:37)
at&org.hibernate.persister.entity.BasicEntityPersister.toType(BasicEntityPersister.java:1094)
at&org.hibernate.hql.ast.FromElementType.getPropertyType(FromElementType.java:273)
at&org.hibernate.hql.ast.FromElement.getPropertyType(FromElement.java:349)
at&org.hibernate.hql.ast.DotNode.getDataType(DotNode.java:474)
at&org.hibernate.hql.ast.DotNode.prepareLhs(DotNode.java:208)
at&org.hibernate.hql.ast.DotNode.resolve(DotNode.java:166)
at&org.hibernate.hql.ast.FromReferenceNode.resolve(FromReferenceNode.java:87)
at&org.hibernate.hql.ast.FromReferenceNode.resolve(FromReferenceNode.java:83)
at&org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:463)
at&org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:863)
at&org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:3713)
at&org.hibernate.hql.parisonExpr(HqlSqlBaseWalker.java:3190)
at&org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1405)
at&org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:599)
at&org.hibernate.hql.antlr.HqlSqlBaseWalker.deleteStatement(HqlSqlBaseWalker.java:301)
at&org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:171)
at&org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:189)
at&org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:130)
at&org.hibernate.hql.pile(QueryTranslatorImpl.java:83)
at&org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)
at&org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
at&org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:865)
at&org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:89)你检查下,&有&roleId&这个字段吗&?
还有就是&没必要这么急的roleId&这个字段在??.hbm.xml映射文件里没有设置could&not&resolve&property:&roleId&of:&com.wei.entity.Roleright&[delete&from&com.wei.entity.Roleright&where&roleinfo.roleId=1]
你看看的配置文件&或者你的JPA&是否配置正确&&roleId字段&是否和数据库字段对应不一致delete&from&com.wei.entity.Roleright&where&roleinfo.roleId=1,
你查的对象是Roleright,又哪里来的roleinfo.roleId呢?
你应该给他另外起个别名,
delete&from&com.wei.entity.Roleright&as&roleinfo&where&roleinfo.roleId=1我的映射文件,和实体类&全是用hibernate反射自动生成的,这个应该是没问题的引用&1&楼&yangwenchaox&的回复:你检查下,&有&roleId&这个字段吗&?
还有就是&没必要这么急的
肯定急咯,我都弄了2天了,就那一个问题没解决!可以理解你的心情!
呵呵...引用&4&楼&zhaoxikuaile&的回复:delete&from&com.wei.entity.Roleright&where&roleinfo.roleId=1,
你查的对象是Roleright,又哪里来的roleinfo.roleId呢?
你应该给他另外起个别名,
delete&from&com.wei.entity.Roleright&as&roleinfo&where&roleinfo.roleId=1
还是有眼神好的~~&&就是红色的地方&你是不是&把&HQL语句&和&SQL语句&搞混淆了,别着急,慢慢来、org.springframework.orm.hibernate3.HibernateQueryException:&could&not&resolve&property:&roleId&of:&com.wei.entity.Roleright&[delete&from&com.wei.entity.Roleright&where&roleinfo.roleId=1];
你看下com.wei.entity包下的Roleright类中没有roleId&属性或者在映射文件中找没有对应的配置.有问题进&/1xXbuh&&&或者&/1IQli5&&&祝你好运!嘻嘻&&加油吧引用&5&楼&weihui5368452&的回复:我的映射文件,和实体类&全是用hibernate反射自动生成的,这个应该是没问题的
顽固不化,别人给你说了一个疑问,不知道检查一下么?或者去看看各位,我都查了几天了,类和映射文件不知看了多少遍了,数据库我多换了很多个数据库,还有就是我的是hql,执行方法是super.getHibernateTemplate().bulkUpdate("delete&from&Roleright&where&roleinfo.roleId="+roleId);&&另外roleinfo.roleId&中的roleinfo不是它的别名而是Roleright类里面一个RoleInfo类属性,就是多对一关系&
还有就是我做SSH项目有1年多了,不是新手,虽然不是很精通,但绝对不是啥都不会,也不会连一些简单的错都不知道的!回答问题前先声明一下:楼主虽然不是新手,但在13楼以上所表述的问题状况真是欠水平呢,就14楼的补充还能让人想象一下。。。。
其实楼主应该把Roleright&&Roleinfo这两个类也贴出来列更好解决好的,就如楼上所说
public&class&Roleright&implements&java.io.Serializable&{
private&Integer&rightId;
private&Sysmenu&
private&Roleinfo&
//&Constructors
/**&default&constructor&*/
public&Roleright()&{
/**&full&constructor&*/
public&Roleright(Sysmenu&sysmenu,&Roleinfo&roleinfo)&{
this.sysmenu&=&
this.roleinfo&=&
//&Property&accessors
public&Integer&getRightId()&{
return&this.rightId;
public&void&setRightId(Integer&rightId)&{
this.rightId&=&rightId;
public&Sysmenu&getSysmenu()&{
return&this.
public&void&setSysmenu(Sysmenu&sysmenu)&{
this.sysmenu&=&
public&Roleinfo&getRoleinfo()&{
return&this.
public&void&setRoleinfo(Roleinfo&roleinfo)&{
this.roleinfo&=&
&?xml&version="1.0"&encoding="utf-8"?&
&!DOCTYPE&hibernate-mapping&PUBLIC&"-//Hibernate/Hibernate&Mapping&DTD&3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&
&&&&Mapping&file&autogenerated&by&MyEclipse&Persistence&Tools
&hibernate-mapping&
&&&&&class&name="com.wei.entity.Roleright"&table="roleright"&catalog="test"&
&&&&&&&&&id&name="rightId"&type="java.lang.Integer"&
&&&&&&&&&&&&&column&name="RightId"&/&
&&&&&&&&&&&&&generator&class="native"&/&
&&&&&&&&&/id&
&&&&&&&&&many-to-one&name="sysmenu"&class="com.wei.entity.Sysmenu"&fetch="select"&
&&&&&&&&&&&&&column&name="NodeId"&/&
&&&&&&&&&/many-to-one&
&&&&&&&&&many-to-one&name="roleinfo"&class="com.wei.entity.Roleinfo"&fetch="select"&
&&&&&&&&&&&&&column&name="RoleId"&/&
&&&&&&&&&/many-to-one&
&&&&&/class&
&/hibernate-mapping&
public&class&Roleinfo&implements&java.io.Serializable&{
private&Integer&roleId;
private&String&roleN
private&Set&rolerights&=&new&HashSet(0);
private&Set&userses&=&new&HashSet(0);
//&Constructors
/**&default&constructor&*/
public&Roleinfo()&{
/**&full&constructor&*/
public&Roleinfo(String&roleName,&Set&rolerights,&Set&userses)&{
this.roleName&=&roleN
this.rolerights&=&
this.userses&=&
//&Property&accessors
public&Integer&getRoleId()&{
return&this.roleId;
public&void&setRoleId(Integer&roleId)&{
this.roleId&=&roleId;
public&String&getRoleName()&{
return&this.roleN
public&void&setRoleName(String&roleName)&{
this.roleName&=&roleN
public&Set&getRolerights()&{
return&this.
public&void&setRolerights(Set&rolerights)&{
this.rolerights&=&
public&Set&getUserses()&{
return&this.
public&void&setUserses(Set&userses)&{
this.userses&=&
&?xml&version="1.0"&encoding="utf-8"?&
&!DOCTYPE&hibernate-mapping&PUBLIC&"-//Hibernate/Hibernate&Mapping&DTD&3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&
&&&&Mapping&file&autogenerated&by&MyEclipse&Persistence&Tools
&hibernate-mapping&
&&&&&class&name="com.wei.entity.Roleinfo"&table="roleinfo"&catalog="test"&
&&&&&&&&&id&name="roleId"&type="java.lang.Integer"&
&&&&&&&&&&&&&column&name="RoleId"&/&
&&&&&&&&&&&&&generator&class="native"&/&
&&&&&&&&&/id&
&&&&&&&&&property&name="roleName"&type="java.lang.String"&
&&&&&&&&&&&&&column&name="RoleName"&length="50"&/&
&&&&&&&&&/property&
&&&&&&&&&set&name="rolerights"&inverse="true"&
&&&&&&&&&&&&&key&
&&&&&&&&&&&&&&&&&column&name="RoleId"&/&
&&&&&&&&&&&&&/key&
&&&&&&&&&&&&&one-to-many&class="com.wei.entity.Roleright"&/&
&&&&&&&&&/set&
&&&&&&&&&set&name="userses"&inverse="true"&
&&&&&&&&&&&&&key&
&&&&&&&&&&&&&&&&&column&name="roleId"&/&
&&&&&&&&&&&&&/key&
&&&&&&&&&&&&&one-to-many&class="com.wei.entity.Users"&/&
&&&&&&&&&/set&
&&&&&/class&
&/hibernate-mapping&
删除hql执行代码是:public&void&assingRights(final&int&roleId,&String[]&selectedNodes)&{
System.out.println(11);
&&&& Roleinfo&role&=&(Roleinfo)&this.getRole(roleId);
super.getHibernateTemplate().bulkUpdate("delete&Roleright&where&roleinfo.roleId="+roleId);
if&(null&!=&selectedNodes)&{
for&(int&i&=&0;&i&&&selectedNodes.&i++)&{
Roleright&right&=&new&Roleright();
Sysmenu&sys&=&new&Sysmenu();
sys.setNodeId(Integer.parseInt(selectedNodes[i]));
right.setSysmenu(sys);
right.setRoleinfo(role);
super.getHibernateTemplate().save(right);
}catch&(Exception&e)&{
e.printStackTrace();
}"delete&from&Roleright&where&roleinfo.roleId="+roleId
这一句:你可以先让Hb显示SQL(即使报错也会先显示SQL的);
这种查询方式要求roleinfo.roleId所对应该的字段是一个外键,是外键而且要求两个表中的字段名要是一样的,数据库中可能不区分大小写,但映射文件区分,这样做的原因是:
假如对象属性Roleinfo.roleId所对应的表中字段名为roleId101
当hibernate调用使用外键作为条件时,如
delete&from&Roleright&where&roleinfo.roleId&=&$XXX
翻译成的SQL实际是
delete&from&Roleright&where&roleId101&=&$XXX,
这时如果你的对象Roleright&所对应的表中没有roleId101这个字段就会报错说没有roleId101这个字段17楼回答不包含16楼的补充我们QQ上聊好吗!我的QQ号是:"delete&Roleright&roleright&where&roleright.roleinfo.roleId="+roleId
试试?不是啊,18楼帮我解决问题了,但不是根本解决,它把super.getHibernateTemplate().bulkUpdate("delete&Roleright&where&roleinfo.roleId="+roleId);的roleinfo.roleId换成数据库表Roleright表中的RoleId字段了,就是super.getHibernateTemplate().bulkUpdate("delete&Roleright&where&RoleId="+roleId);&居然删除成功,但他还不知道为啥可以成功,hql里面写的是sql字段居然可以&&&&
不过还是太感谢他了!期待新答案~~~~
建议查找原因的方法:
清楚已发布的文件,在myeclipse下方的servers选择卡中选中使用的server,右键,[clean]
然后再[publish],
此步用于检查是否缓存的原因
假设配置正确,让Hb根据配置自成table,如果生成成功,且运行通过,则table有问题,否则配置有问题
1.在Hb的配置文件中增加
hibernate.cfg.xml
&property&name="hbm2ddl.auto"&update&/property&
2.将数据源的数据库改一下,改数据库就是了,不要建表,一个空的新的数据库就行了
&property&name="connection.url"&jdbc:mysql://localhost:3306/test&/property&
将数据库test改为另一个存在或新建的数据库,当然同时要改所以$XXClase.hbm.xml中的
&class&name="t1.bean.Roleright"&table="roleright"&catalog="test"&
(据我所知,楼主的XXX.hbm.xml还是比较少的)
3.配置的数据库连接的用户要对修改后的数据库具有比较高的权限,要有alter/create&table的权限,为了方便就弄个
4.运行,Hb会逆向自成table;
5.以上如果都成功,则表明之前的问题出在数据库层
6.如果不行,则出在映射文件的配置上。Hb会逆向自成table&什么意思?具体还是搞不明白!就是Hb根据XXX.hbm.xml自动生成数据库中的表,包括约束delete&from&com.wei.entity.Roleright&where&roleinfo.roleId=1
delete&from&com.wei.entity.Roleright&roleinfo&where&roleinfo.roleId=1
别名问题楼上这位实在是太菜了,怎么可能这么简单,人家25楼的才是高手啊!
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:}

我要回帖

更多关于 斗地主记牌器官方下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信